问题描述
Microsoft 的 Identity Platform 上的 OAuth 实现将范围用于委派权限,将角色用于应用程序权限。我正在编写一个受保护的 Web API,它支持两种类型的访问令牌。
对于范围验证,我可以使用以下策略定义将 [Authorize(Policy = "HasTheScope")]
应用到我的控制器操作:
options.AddPolicy("HasTheScope",policy => policy.RequireClaim("scp","TheScope"));
对于角色验证,我可以应用具有以下策略定义的 [Authorize(Policy = "HasTheRole")]
:
options.AddPolicy("HasTheRole",policy => policy.RequireRole("TheRole"));
对于多个 [Authorize]
属性,必须满足所有这些属性,因此不可能简单地将这两个策略应用于操作。
允许针对应用请求(使用客户端凭据流创建的令牌)和代表用户的请求(使用授权代码流创建的令牌)访问我的控制器操作的最佳做法是什么?
解决方法
从逻辑上来说,感觉您需要查看传入的令牌并为客户端凭据流做不同的事情,其中不会有主题声明。
所以需要一个“或”条件,如果你想使用策略定义一个自定义的 - 查看 RequireAssertion 语法 - 这个 Curity guides article 有一些例子:
options.AddPolicy("lowRisk",policy =>
policy.RequireAssertion(context =>
context.User.HasClaim(claim =>
claim.Type == "risk" && Int32.Parse(claim.Value) < 50
)
)
);