如何在ASP.NET MVC 5下为用户创建一个“虚拟”或“临时”角色,该角色仍可用于控制器和方法装饰?

问题描述 投票:-1回答:1

当前的项目:

我对如何在MVC 5下创建“虚拟”角色感到有点困惑。

正常(持久)角色我完全理解:您在数据库中创建它们,然后将用户分配给该角色。但是,我需要根据完全不相关的表中的状态将用户分配给“角色”,并且该角色仅在其会话期间存在 - 该用户在登录之前不存在,并且不再存在对于该用户一旦他们的会话结束。

因此,例如,由于活动状态取决于用户是否休假,因此我们将此表称为“休假”表。非常简单:主键,用户ID外键,所需的开始日期和可选的结束日期。当用户登录时,我需要将用户标记为完全活动(仅适用于该会话的实际活动角色)或非活动状态(该会话没有活动角色)。这将取决于是否,

  1. 用户在“休假”表中有一个条目,如果是,
  2. 最近的条目有, 空结束日期,或 未来的结束日期

如果用户在表中有条目,并且最近的条目将来具有空结束日期或结束日期,则用户不会获得活动角色。如果他们不符合这一要求,他们就会发挥这一作用。

这只是网站上需要虚拟角色的众多要求之一,但它是一个简化的例子来说明问题。

这也非常重要,因为大约95-99%的需求围绕控制器和方法装饰以及会话授权 - 我需要能够使用[Authorize(Roles = "Active")]User.Identity.IsInRole("Active"),但我希望该角色仅为该会话存在于用户。

请理解基础数据是完全动态的:如果后端的数据更改为使Active状态无效的内容,我希望他们的下一次登录不包括应用于其会话的Active角色。这就是为什么我尝试使用“虚拟”或“临时”角色,用户在内部数据方面没有直接关联。

现在,如果它只是被检查的一件事(如On Leave表),我可以确保添加结束日期会将用户添加到完全传统的Active角色,但是未来的条目存在问题 - - 一旦该日期过去,我将如何自动将用户添加到该角色,至少在没有进行数据库写入和登录反弹以正确设置其身份验证和会话变量的情况下?

此外,这只是许多需要协同工作的一项,以便为Active状态提供是/否的确定。此活动状态不仅会从On Leave表的最新条目中提取,还会从系统周围的许多不同业务规则中获取,这些规则可以通过_userManager从用户配置文件的初始提取中检索到,以及所有这些规则虚拟布尔值提供一个简单的累积是 - 否答案。

关键是,这个Active角色状态永远不会触及数据库,甚至不需要。这将始终位于当前登录用户的上下文中,在用户登录时设置,并在超时或注销时转储/销毁。

我怀疑这样做的地方是在SignInAsync,我设置了所有的声明,我只是不知道如何对用户的会话这样做。

如果有人可以提供一些关于如何在那里设置虚拟角色的提示,系统(控制器和方法装饰)可以使用,那将是真正的膨胀。


根据要求,我的登录实现:

var user = await _userManager.FindAsync(model.Username, model.Password);
if(user != null) {
  SignInAsync(user, false).Wait();
  // Bounce the user to the "Nexus" method, that determines where they should go based on Role, so that the Role can actually be read once it is in the User’s context.
}

而我的SignInAsync()任务:

private async Task SignInAsync(IdentityUser user, bool isPersistent) {
  AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
  var identity = await _userManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);
  identity.AddClaim(new UserClaim.Claim("ShortName", user.ShortName));
  identity.AddClaim(new UserClaim.Claim("Name", user.Name));
  // Snipped for brevity
  AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, identity);
}
asp.net asp.net-mvc asp.net-mvc-5 roles
1个回答
0
投票

似乎微软正在进行基于Claims的授权。在ASP.NET Identity中,角色用于向后兼容。

但是,您仍可以将角色设置为声明。例如,

claims.Add(new Claim(ClaimTypes.Role, "Admin"));

然后,您将Authorize属性应用于控制器或操作方法,如[Authorize(Roles = "Admin")]

Here是GitHub的示例代码。

© www.soinside.com 2019 - 2024. All rights reserved.