【问题标题】: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);

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


【解决方案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"),
  • 不,它没有回答我的问题,我从一开始就是这样,但它不起作用
  • 是的,但不可能实现您描述的多个角色。除了这个方法,你还能接受哪些方法来实现?能不能描述的更清楚一点?
猜你喜欢
  • 2012-11-07
  • 1970-01-01
  • 1970-01-01
  • 2017-06-08
  • 2014-05-01
  • 2014-03-15
  • 1970-01-01
  • 2011-08-25
相关资源
最近更新 更多