基于声明的授权

Posted

技术标签:

【中文标题】基于声明的授权【英文标题】:Claim based authorization 【发布时间】:2021-04-13 03:05:19 【问题描述】:

我有一个用户有以下声明: role: ["Admin","Tester"]

我希望只能通过角色声明值“Admin”访问控制器方法。 为此,我添加了这样的政策:

services.AddAuthorization(options => 
            options.AddPolicy("Admin", policy => policy.RequireClaim("role", "Admin"));
        );

并在我的控制器方法之上添加了[Authorize(Policy = "Admin")] 属性。

很遗憾,当启动应用程序时,用户没有访问权限。

如果我从他的声明中删除角色 Tester,以便他只有管理员 (role: "Admin") 并且不再是数组,那么他确实具有访问权限。

据我了解,该政策应该像“包含”一样检查,但不知何故这似乎不起作用。

我做错了吗?

【问题讨论】:

你试过policy.RequireRole() 好电话,我还没试过。不幸的是它仍然不起作用:-( 这可能值得一读referbruv.com/blog/posts/… 您能否向我们展示您如何向用户添加声明,代码如下:new Claim(ClaimTypes.Role, "Admin", ClaimValueTypes.String); 【参考方案1】:

您可能没有正确理解它。一个声明最多有六个参数,每个参数对应一个不同的函数,而不是一个数组。这是源代码。

public Claim(string type, string value, string valueType, string issuer, string originalIssuer, ClaimsIdentity subject);

您可以逐一添加这些声明。

    var claims = new List<Claim>
            
                
                new Claim("role","Tester"),
                new Claim("role","Admin"),
            ;

声明可以存储多个相同的 ClaimType。

另外,你可以参考这个answer。

【讨论】:

是的,我就是这样,我添加了多个这样的角色:new Claim(JwtClaimTypes.Role, "Admin"), new Claim(JwtClaimTypes.Role, "Tester"), 不,它没有回答我的问题,我从一开始就是这样,但它不起作用 是的,但不可能实现您描述的多个角色。除了这个方法,你还能接受哪些方法来实现?能不能描述的更清楚一点?

以上是关于基于声明的授权的主要内容,如果未能解决你的问题,请参考以下文章

Asp.net核心身份声明与基于角色的授权[重复]

基于IdentityServer4的声明的授权

如何使用基于策略的授权将所需的声明附加到令牌?

如何使用 Web Api Asp.Net Core 实现基于声明的授权?

IdentityServer4 客户端范围和基于用户声明的授权

如何在不使用角色的情况下使用 ASP.NET WebAPI 实现基于声明的授权?