我正在开发一个ASP.NET MVC5 web应用程序,该应用程序具有以下相关属性:
- 使用MVC5.1、Identity 2.0,不限于任何遗留的东西-可以使用最新的一切
- 用户至少属于一个组织
- 每个组织至少有一个用户是组织管理员
- 组织管理员可以允许用户特定的权限,例如成为另一个组织管理员
- 据我所知,处理这一问题的一个好方法是使用索赔
除了默认声明之外,用户通常还可以有以下声明:
组织:{some-guid}组织管理员:{与上述guid相同}组织发布服务器:{再次使用相同的guid}
可能会有超级管理员,甚至超级用户,声称他们可以访问多个组织中的不同角色。
现在,让我们假设我是登录到管理面板的用户admin
,并且我想为用户user
授予我拥有组织管理员声明的组织的组织发布者声明。
为了简单起见,我有一个看起来像这样的模型对象:
public class GrantRightModel
{
public string OrganizationId { get; set; }
public string UserId { get; set; }
public string Right { get; set; }
}
为了这个例子的目的,我们从admin
用户那里得到以下值:
- OrganizationId:
admin
具有组织管理员声明的组织的GUID - 用户ID:
user
- 右:组织发布者
关于这种做事方式,有很多事情让我回避了。假设我们有一个带有GrantRight操作的OrgAdmin控制器;
控制器操作是否需要检查当前登录的用户(例如使用ClaimsPrincipal.Current找到)是否"手动"拥有GrantRightModel.OrganizationId的OrganizationAdmin声明,或者这类事情是否有聪明的身份验证属性?
在代码中,将组织发布服务器:{guid}声明添加到
user
的正确方法是什么?我的控制器将根据需要通过依赖项注入获得UserManager。如果
user
在这种情况下登录到应用程序,有没有办法让他从下一个请求开始自动获得正确的索赔?我已经看到了提到的方法,这些方法会导致用户注销,这样他就可以再次登录,并用他的新声明开始新的会话。我明白为什么会这样,但考虑到用户可能正在做一些需要花费大量时间的事情,当他试图提交作品时,让他注销可能并不流行。
网上有一些关于这方面的信息,但我的谷歌傅没有找到一个能告诉我如何战胜这三点的。
有人吗?
谢谢!
关注您的问题。
控制器操作是否需要检查当前登录的用户(例如使用ClaimsPrincipal.Current找到)是否"手动"拥有GrantRightModel.OrganizationId的OrganizationAdmin声明,或者这类事情是否有聪明的身份验证属性?
没有。Authorize
属性采用在授权时检查的角色的可选列表。如果其中一个角色声明指向该角色,则所使用的是不涉及自定义代码的授权。
在代码中,向用户添加组织发布服务器:{guid}声明的正确方式是什么?我的控制器将根据需要通过依赖项注入获得UserManager。
您使用正确的声明创建ClaimsIdentity
,然后要求授权管理器使用该标识登录。该身份通常会与声明一起保存在cookie中。
如果用户在这种情况下登录到应用程序,是否有一种方法可以让他从下一个请求开始自动获得正确的声明?我已经看到了提到的方法,这些方法会导致用户注销,这样他就可以再次登录,并用他的新声明开始新的会话。我明白为什么会这样,但考虑到用户可能正在做一些需要花费大量时间的事情,当他试图提交作品时,让他注销可能并不流行。
我读了两遍,但不太明白。当你发布cookie时,cookie负责保留经过身份验证的会话。然后在每个请求管道的早期基于cookie重新构建声明。然后,用户可以发出大量请求,只要cookie没有失效或存储在cookie中的auth令牌过期,他仍然"登录"。