0

Microsoft 身份平台上的 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]属性,必须满足所有属性,因此不可能简单地将两个策略应用于操作。

允许对应用程序请求(使用客户端凭据流创建的令牌)和代表用户的请求(使用授权代码流创建的令牌)访问我的控制器操作的最佳实践方法是什么?

4

1 回答 1

0

从逻辑上讲,您需要查看传入的令牌并为客户端凭据流做不同的事情,其中​​不会有主题声明。

所以需要一个“或”条件,如果你想使用策略定义一个自定义的 - 看看 RequireAssertion 语法 - 这个Curity 指南文章有一些例子:

options.AddPolicy("lowRisk", policy =>
        policy.RequireAssertion(context =>
            context.User.HasClaim(claim => 
                claim.Type == "risk" && Int32.Parse(claim.Value) < 50
            )
        )
    );
于 2021-07-02T18:08:50.677 回答