![](/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.