我有一个用户提出以下声明:
role: ["Admin","Tester"]
我希望控制器方法只能通过角色声明值“Admin”访问。 为此,我添加了这样的策略:
services.AddAuthorization(options => {
options.AddPolicy("Admin", policy => policy.RequireClaim("role", "Admin"));
});
并在我的控制器方法之上添加了 [Authorize(Policy = "Admin")]
属性。
不幸的是,当启动应用程序时,用户没有访问权限。
如果我从他的声明中删除角色 Tester
,以便他只有管理员 (role: "Admin"
) 并且不再是数组,那么他确实可以访问。
据我所知,该政策应该像“包含”一样检查,但不知何故似乎不起作用。
我做错了吗?
答案 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。
另外,你可以参考这个answer。