![](/img/trans.png)
[英]How to create a JWT token with custom JSON claims in Payload using .Net (C#) in Asp.NET Core WEB API
[英]How to check privileges in JWT using Claims in ASP.NET Core?
我有一个有关Claims,JWT和ASP.Net Core的问题。 再次...(问候克里斯)。 所以...
我的JWT有Claim :
"Authorization": "CanEditUnit,CanBrowseUnit,CanCreateUnit,CanDeleteUnit,CanSeeUnitDetails,CanBrowseRole,CanEditRole,CanCreateRole,CanDeleteRole,CanSeeRoleDetails,CanBrowseUser,CanSeeUserDetails,CanDeleteUser,CanEditUser,CanRegisterNewUser"
等等
该Claim拥有用户所拥有的所有特权(例如:如果用户在数据库中将CanEditUnit设置为True,则CanEditUnit将保存在Authorization Claim中,但是如果将某些内容设置为False,则它根本不会出现在该Claim中。
然后,我想检查用户是否在策略中具有该特权:
options.AddPolicy("CanEditUnit", policy => policy.RequireClaim("Authorization", "CanEditUnit"));
但是它可能会检查Authorization Claim是否等于CanEditUnit 。
有没有一种方法可以使用包含而不是等于检查策略? 如果没有,我该怎么办?
我在文档中找到了它 ,但是我不知道如何使用它。
正如您在问题中所建议的那样,看起来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"));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.