如何使用 ASP.NET Core 中的声明检查 JWT 中的权限?
Posted
技术标签:
【中文标题】如何使用 ASP.NET Core 中的声明检查 JWT 中的权限?【英文标题】:How to check privileges in JWT using Claims in ASP.NET Core? 【发布时间】:2018-12-24 21:40:23 【问题描述】:我有一个关于 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 声明中,但如果某些内容设置为 False,则它根本不会出现在该声明中。
然后我想检查用户是否在这样的策略中拥有该特权:
options.AddPolicy("CanEditUnit", policy => policy.RequireClaim("Authorization", "CanEditUnit"));
但它可能会检查 Authorization 声明是否等于 CanEditUnit。
有没有办法用 Contains 而不是 Equal 来检查策略?如果没有,我该怎么办?
我在文档中找到了this,但我不知道如何使用。
【问题讨论】:
【参考方案1】:正如您在问题中所建议的那样,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"));
【讨论】:
以上是关于如何使用 ASP.NET Core 中的声明检查 JWT 中的权限?的主要内容,如果未能解决你的问题,请参考以下文章
在 ASP .NET Core Web API 请求期间检查用户声明
如何使用剃刀视图 ASP .Net Core 从 JWT 声明角色