基于声明的授权
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"),
不,它没有回答我的问题,我从一开始就是这样,但它不起作用
是的,但不可能实现您描述的多个角色。除了这个方法,你还能接受哪些方法来实现?能不能描述的更清楚一点?以上是关于基于声明的授权的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Web Api Asp.Net Core 实现基于声明的授权?