4

我正在开发具有以下相关属性的 ASP.NET MVC5 Web 应用程序:

  • 使用 MVC5.1,Identity 2.0,不限于任何遗留的东西 - 可以使用最新的一切。
  • 一个用户至少属于一个组织。
  • 每个组织至少有一个用户是组织管理员。
  • 组织管理员可以授予用户特定权限,例如成为另一个组织管理员。
  • 据我了解,处理此问题的一个好方法是使用声明。

除了默认声明之外,用户通常还可以拥有以下声明:

组织:{some guid} 组织管理员:{与上述相同的 guid} 组织发布者:{再次相同的 guid}

可能有超级管理员,甚至超级用户,声称他们可以访问多个组织中的不同角色。

现在,让我们假设我是admin登录到我的管理面板的用户,并且我想向用户授予user我拥有 Organization-Admin 声明的组织的 Organization-Publisher 声明。

为简单起见,我有一个看起来像这样的模型对象:

public class GrantRightModel
{
   public string OrganizationId { get; set; }
   public string UserId { get; set; }
   public string Right { get; set; }
}

出于本示例的目的,我们从admin用户那里获得以下值:

  • OrganizationId:admin拥有组织管理员声明的组织的 GUID。
  • 用户身份:user
  • 右:组织-发布者

关于这种做事方式,有很多事情让我回避了。假设我们有一个带有 GrantRight 操作的 OrgAdmin 控制器;

  • 控制器操作是否需要“手动”检查当前登录的用户(例如使用 ClaimsPrincipal.Current 找到)是否具有 GrantRightModel.OrganizationId 的 Organizaton-Admin 声明,或者这种事情是否有聪明的身份验证属性?

  • 在代码中添加 Organization-Publisher: {guid} 声明的正确方法是什么user?我的控制器将根据需要通过依赖注入获得 UserManager。

  • 如果user在发生这种情况时登录到应用程序,有没有办法让他从他的下一个请求开始自动获得正确的索赔?我已经看到提到的方法会导致用户退出,以便他再次登录并使用他的新声明开始新的会话。我明白为什么会这样,但考虑到用户可能正在处理需要花费大量时间的事情,当他尝试提交他的工作时让他退出可能并不受欢迎。

网上有一些关于这方面的信息,但我的 google-fu 未能找到能告诉我如何击败这三点的那个。

任何人?

谢谢!

4

1 回答 1

3

关于你的问题。

控制器操作是否需要“手动”检查当前登录的用户(例如使用 ClaimsPrincipal.Current 找到)是否具有 GrantRightModel.OrganizationId 的 Organizaton-Admin 声明,或者这种事情是否有聪明的身份验证属性?

否。该Authorize属性采用在授权时检查的可选角色列表。如果角色声明之一指向该角色,则已授权使用,不涉及自定义代码。

在代码中添加 Organization-Publisher: {guid} 声明给用户的正确方法是什么?我的控制器将根据需要通过依赖注入获得 UserManager。

ClaimsIdentity使用正确的声明创建,然后要求授权管理器使用该身份登录。然后,身份通常会与声明一起保存在 cookie 中。

如果用户在发生这种情况时登录到应用程序,有没有办法让他从他的下一个请求开始自动获得正确的声明?我已经看到提到的方法会导致用户退出,以便他再次登录并使用他的新声明开始新的会话。我明白为什么会这样,但考虑到用户可能正在处理需要大量时间的事情,当他尝试提交他的工作时让他退出可能并不受欢迎。

我已经读了两遍,不太明白。当您发出 cookie 时,cookie 负责保留经过身份验证的会话。然后根据 cookie 在每个请求管道中尽早重建声明。然后用户可以发出大量请求,只要 cookie 没有失效或存储在 cookie 中的身份验证令牌过期,他仍然“登录”。

于 2014-04-11T17:38:58.103 回答