【问题标题】:does Authorize attribute with Roles take Claims into account具有角色的授权属性是否考虑了声明
【发布时间】:2018-11-07 03:52:00
【问题描述】:

我尝试在网络上到处搜索,但我似乎无法弄清楚这个重要部分。

基本上,如果我们在检查用户是否属于某个角色时每次都调用数据库 - 这将对性能产生负面影响。

我看到列出所有用户角色的代码示例,例如

var roles = ((ClaimsIdentity)User.Identity).Claims
            .Where(c => c.Type == ClaimTypes.Role)
            .Select(c => c.Value);

代码可用于控制器动作,也可以在属性过滤器中以相同的方式获取声明。

从这个例子我推断Claims 开始发挥作用(似乎是最高效的解决方案)。

我试图找出 如果 Authorize 具有角色的属性验证用户的声明,但 official Microsoft documentation 没有涵盖这一点。

AuthorizeAttribute

指定对控制器或操作方法的访问仅限于满足授权要求的用户。

属性:

Roles - 获取或设置有权访问控制器或操作方法的用户角色。

这就是我们所拥有的范围。

【问题讨论】:

    标签: c# asp.net-mvc asp.net-identity


    【解决方案1】:

    两个 Authorize 属性,例如User.IsInRole 查看 User.Identity 角色声明。

    默认情况下,授权(用户登录的地方)会将 AspNetUserRoles 表中的角色添加为“http://schemas.microsoft.com/ws/2008/06/identity/claims/role”类型的声明。见WIF claimtypes members

    客户端应用程序将自动从令牌/cookie 中获取信息并将其转换为 User.Identity。当声明类型匹配时,角色类型声明被映射为角色。

    这意味着应用不需要访问用户商店。在大多数情况下,这也是不可能的。所以它实际上不是关于性能,而是关于可访问性。通常应用程序无权访问身份上下文。所以 UserManager 不是一个选项。

    然而,使用声明时有一个缺点。信息已过时。当用户登录时,声明的快照会被添加到身份中。如果同时在数据库中更新声明(或角色),则不会记录这些更改。只有在用户再次登录后,更改才会生效。

    这意味着声明仅适用于不会(经常)更改的信息,除非您找到使声明无效的方法。但这可能意味着访问数据库或调用权限。

    这就是我不建议使用角色的原因。由于角色往往用于授权,但同时您不能撤销访问权限。所以在你解决这个问题之前,你可能需要考虑一个替代方案。

    坚持使用 UserManager 不是一种选择,因为上下文可能并非对所有应用程序都可用。

    这就是为什么基于资源的授权可能是您的解决方案。请阅读我的回答here 了解更多想法。

    【讨论】:

    • 那么为了提高性能……我想,identity 带来了一组存储过程来更快地执行角色检查?您对此有何看法?
    • 我不确定你的意思。 Identity 没有一组存储过程,您只需调用 UserManager。但是您可以覆盖 UserStore 以使用存储过程。但是当使用User.Identity 时,数据库根本不会被命中(除了登录以创建令牌/cookie)。如果您想在每次调用时从数据库中读取角色,那么您还可以考虑缓存信息,这样您就不必每次都调用数据库。
    【解决方案2】:

    打开您的启动文件并更改:

    services.AddDefaultIdentity<IdentityUser>()
    .AddEntityFrameworkStores<ApplicationDbContext>();
    

    到这里:

    services.AddIdentity<IdentityUser, IdentityRole>()
                    .AddEntityFrameworkStores<ApplicationDbContext>()
                    .AddDefaultUI()
                    .AddDefaultTokenProviders();
    

    那么角色应该开始工作了。

    【讨论】:

      猜你喜欢
      • 2014-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-10
      • 2023-03-19
      • 1970-01-01
      相关资源
      最近更新 更多