基于声明的授权

时间:2021-01-07 11:27:27

标签: c# .net asp.net-core jwt identityserver4

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

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

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

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

不幸的是,当启动应用程序时,用户没有访问权限。

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

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

我做错了吗?

1 个答案:

答案 0 :(得分:0)

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

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。

enter image description here

另外,你可以参考这个answer