如何在IdentityServer 4中为不同角色返回不同的范围?

时间:2018-05-10 07:21:28

标签: c# .net-core identityserver4

我正在使用IdentityServer4来保护我的.net核心应用。我想使用Policy-Based Authorization

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

 options.AddPolicy("api.order.write", builder =>
                builder.RequireScope(
                    "app.write", "app.read", "app.order.read"));

我想为不同的角色授予不同的范围。例如,具有角色查看器的用户将只具有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));
                }

但我仍然收到所有范围(不是每个角色),这是在登录请求期间Web客户端发送的范围相同的列表。

1 个答案:

答案 0 :(得分:4)

您在此处混合客户端授权(即OAuth / OIDC用语中的范围)和用户授权。

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

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