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

标签 c# .net-core identityserver4

我正在使用 IdentityServer4 来保护我的 .net core 应用程序。我想使用Policy-Based Authorization

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

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

我想为不同的角色授予不同的范围。例如,具有 Viewer 角色的用户将仅具有 app.read 范围。因此,在登录请求期间,Web 客户端会向身份发送请求,其中包含我们在应用程序中拥有的所有范围的列表,但它应该处理并返回具有基于角色的范围的 token 。我想我可以实现自定义 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/资源本身内部进行(并且在基本范围检查发生之后),而不是在颁发 token 时的 IDS4 服务中进行。

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

关于c# - 如何在 IdentityServer 4 中为不同角色返回不同范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50267663/

相关文章:

c# - 查找终端服务用户的文档文件夹

c# - 在 Linux 上使用 .NET Core 2.0 进行 Process.Start

c# - .Net Core 应用程序中缺少 NativeCallableAttribute

c# - 如何诊断尝试在 C# .NET Core 中获取 OAuth2 持有者 token 的 401 错误?

c# - IdentityServer4发现文档返回404

角色 - Identity Server 4

c# - 从 EF6 迁移到 EF Core 2.0

c# - 如何从停靠面板中删除用户控件

c# - 跳过可空对象的 ThenBy

openid - IdentityServer4 为什么我们需要发现端点