如何为IdentityServer 4中的不同角色返回不同的作用域?

Ole*_*leh 2 c# .net-core identityserver4

我正在使用IdentityServer4保护我的.net核心应用程序。我想使用基于策略的授权

这是我执行的一项政策示例

 options.AddPolicy("api.order.write", builder =>
                builder.RequireScope(
                    "app.write", "app.read", "app.order.read"));
Run Code Online (Sandbox Code Playgroud)

我想为不同的角色分配不同的作用域。例如,具有角色查看器的用户将只有app.read范围。因此,在登录请求期间,Web客户端会将请求发送给具有我们在应用程序中所有作用域列表的身份,但是它应该处理并返回具有基于角色的作用域的令牌。我认为我可以在其中实现自定义IProfileService并检查用户角色,并在范围内添加声明,但是也许已经有解决方案。你有什么想法 ?

UPD:我创建了自定义IProfileService,正在检查用户角色,然后设置像这样的范围的特定列表

                //removing existing scopes if such exist already 
                context.IssuedClaims = context.IssuedClaims.Where(x => x.Type != "scope").ToList();

                foreach (var scope in viewerScopes)
                {
                    context.IssuedClaims.Add(new Claim("scope", scope));
                }
Run Code Online (Sandbox Code Playgroud)

但我仍然收到所有作用域(不是每个角色),即Web客户端在登录请求期间发送的作用域列表。

mac*_*kie 5

您在这里混合了客户端授权(即OAuth / OIDC术语中的范围)和用户授权。

用户授权检查应在API /资源本身内部进行(并在进行基本范围检查之后),而不是在颁发令牌时在IDS4服务中进行。

https://leastprivilege.com/2016/12/16/identity-vs-permissions/

  • 对于给定客户端的所有用户,范围可以并且应该相同。范围控制*客户端*可以访问的内容和*用户可以访问的内容。OAuth 中的“auth”是资源所有者(用户)授予客户端(应用程序)访问其资源(范围)的权限。用户授权完全是一个独立的事情,应该在资源/API 中处理。 (2认同)