我有一个关于 Claims、JWT 和 ASP.Net Core 的问题。再次......(问候克里斯)。所以...
我有我的 JWT 和Claim:
"Authorization": "CanEditUnit,CanBrowseUnit,CanCreateUnit,CanDeleteUnit,CanSeeUnitDetails,CanBrowseRole,CanEditRole,CanCreateRole,CanDeleteRole,CanSeeRoleDetails,CanBrowseUser,CanSeeUserDetails,CanDeleteUser,CanEditUser,CanRegisterNewUser"
等等。
此声明拥有该用户包含的所有权限(例如:如果用户将数据库中的 CanEditUnit 设置为 True,则 CanEditUnit 将保存在授权声明中,但如果某些内容设置为 False,则它根本不会出现在该声明中。
然后我想检查用户是否在这样的策略中拥有该权限:
options.AddPolicy("CanEditUnit", policy => policy.RequireClaim("Authorization", "CanEditUnit"));
但它可能会检查Authorization Claim 是否等于CanEditUnit。
有没有办法用contains而不是Equal来检查策略?如果没有,我该怎么办?
我在文档中找到了这个,但我不知道如何使用它。
正如您在问题中所建议的那样,它看起来RequireAssertion
有能力为您处理这个问题。下面是一个例子:
policy.RequireAssertion(ctx =>
{
var authorizationClaim = ctx.User.FindFirstValue("Authorization");
if (authorizationClaim == null)
return false;
return authorizationClaim.Split(",").Contains("CanEditUnit");
});
这只是查找Authorization
声明,如果存在,则将其拆分,
并检查CanEditUnit
值是否存在。
如果你想要一些更可重用的东西,你可以创建一个AssertionRequirement
你自己的自定义类。下面是一个示例:
public class CustomAssertionRequirement : AssertionRequirement
{
public CustomAssertionRequirement(string requiredValue)
: base(ctx => HandleRequirement(ctx, requiredValue)) { }
private static bool HandleRequirement(AuthorizationHandlerContext ctx, string requiredValue)
{
var authorizationClaim = ctx.User.FindFirstValue("Authorization");
if (authorizationClaim == null)
return false;
return authorizationClaim.Split(",").Contains(requiredValue);
}
}
为了使用这个新类,您可以将其作为要求添加到AuthorizationPolicyBuilder
(而不是使用RequireAssertion
),如下所示:
policy.AddRequirements(new CustomAssertionRequirement("CanEditUnit"));
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句