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

C# 如何为IdentityServer 4中的不同角色返回不同的作用域?,c#,.net-core,identityserver4,C#,.net Core,Identityserver4,我正在使用IdentityServer4保护我的.net核心应用程序。我想用 这是我所做的一项政策的例子 options.AddPolicy("api.order.write", builder => builder.RequireScope( "app.write", "app.read", "app.order.read")); 我想为不同的角色授予不同的作用域。例如,具有角色查看器的用户将只有app.read

我正在使用IdentityServer4保护我的.net核心应用程序。我想用

这是我所做的一项政策的例子

 options.AddPolicy("api.order.write", builder =>
                builder.RequireScope(
                    "app.write", "app.read", "app.order.read"));
我想为不同的角色授予不同的作用域。例如,具有角色查看器的用户将只有app.read作用域。所以,在登录请求期间,web客户端向identity发送请求,其中包含我们在应用程序中拥有的所有作用域的列表,但它应该使用基于角色的作用域处理并返回令牌。我想我可以实现定制的
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));
                }

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

这里混合了客户端授权(即OAuth/OIDC术语中的作用域)和用户授权

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


但令牌包含作用域,并且它们不能对所有用户都相同@mackieam I right@mackie?因为如果只有web客户端,保留作用域是没有意义的。对于给定客户端的所有用户,作用域可以而且应该是相同的。作用域控制客户端可以访问的内容,而不是用户可以访问的内容。OAuth中的“auth”是授予客户端(应用程序)访问其资源(作用域)的资源所有者(用户)。用户授权是完全独立的事情,应该在资源/API中处理。经过更大的研究后,我同意你@mackie。应使用作用域保护不同客户端的api。将你的答案标记为正确。谢谢