gpt4 book ai didi

c# - 具有多个范围的 ASP.NET Core RequireClaim "scope"

转载 作者:太空宇宙 更新时间:2023-11-03 14:44:59 27 4
gpt4 key购买 nike

我正在 ASP.NET Core 2.1 上开发一个授权系统,在授予访问权限之前需要遵守资源级别和范围。也就是说,我必须是一本书的作者(可以有多个),并且必须具有必要的范围(“write.book”、“read.book”、“delete.book”等)。我在 Startup.cs 中成功配置了 JWT,并在传递无效 token 时收到 401s。我遇到的问题是执行范围。 policy.RequireClaim("scope", "write.book") 当访问 token 只需要一个必需的范围时有效,但总是失败访问 token 包含多个范围 "write.book delete .book”。如何配置策略以要求范围列表,这些范围可能是访问 token 包含的范围的子集?我没有看到任何接受范围列表的 Policy 方法,所以我假设框架只是在执行字符串比较,这就是授权失败的原因。 write.book != write.book delete.book。澄清一下,如果策略只需要一个范围 write.book,但访问 token write.book delete.book 中存在多个范围,则授权失败。

以下代码仅在访问 token 包含一个范围时有效,如果存在多个范围则失败。

authorization.AddPolicy("writeBookPolicy", policy => {
policy.RequireAuthenticatedUser().AddAuthenticationSchemes("Bearer")
.RequireClaim("scope", "write.book").Build();
});

{"scope": "write.book"} // Works
{"scope": "write.book delete.book"} //Fails

最佳答案

您必须使用更复杂的 claim 检查。请改用 RequireAssertion() 并解析范围声明:

var scopes = new[] { "write.book", "delete.book" };
builder.RequireAssertion(context => {
var claim = context.User.FindFirst("scope");
if(claim == null) { return false; }
return claim.Value.Split(' ').Any(s =>
scopes.Contains(s, StringComparer.Ordinal)
);
});

我写了一个小的扩展方法,虽然不太容易阅读,但更容易使用:

private static readonly IEnumerable<string> _scopeClaimTypes = new HashSet<string>(StringComparer.OrdinalIgnoreCase) {
"http://schemas.microsoft.com/identity/claims/scope",
"scope"
};
public static AuthorizationPolicyBuilder RequireScope(this AuthorizationPolicyBuilder builder, params string[] scopes) {
return builder.RequireAssertion(context =>
context.User
.Claims
.Where(c => _scopeClaimTypes.Contains(c.Type))
.SelectMany(c => c.Value.Split(' '))
.Any(s => scopes.Contains(s, StringComparer.Ordinal))
);
}

关于c# - 具有多个范围的 ASP.NET Core RequireClaim "scope",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54852094/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com