sha*_*nda 7 claims identityserver3
我已经阅读了Dominik关于使用Identity Server进行身份验证和权限建模的博客文章(https://leastprivilege.com/2016/12/16/identity-vs-permissions/).由于我主要使用基于角色的授权,因此我可以将IdentityServer用作不同客户端和apis的身份验证/授权端点.
我的问题是如何正确建模身份和资源范围?客户端是否可以知道特定资源上的用户可以使用哪些角色?如果是,客户端是否只能知道所请求资源范围的用户角色(而不是所有范围的所有角色).据我了解这个概念,如果我通过UserInfo端点请求有关用户的声明,我收到的声明是由请求的身份范围内列出的claimTypes过滤的.这意味着如果客户端请求角色范围(具有角色 claimtype的标识范围),UserInfo端点将响应所有角色声明,包括其他应用程序.
让我们看一下简单的MVC示例,其中MVC客户端通过REST与API通信.MVC客户端(客户端)使用Cookie/OIDC Auth中间件并请求:ResponseType = "id_token token", Scope = "openid profile api".API(资源)使用IdentityServerBearerToken Auth中间件并要求:RequiredScopes = "api".客户端具有基于api角色可见的UI元素.如何从客户端访问角色,因为UserInfo端点只返回基于身份范围的声明?如果客户询问API(资源),可以采取哪些措施?并基于响应显示/隐藏UI元素?
感谢您的任何帮助.
小智 0
您可以将角色放入您的 id_token 中。在以下情况下实施GetProfileDataAsync并添加您的角色:
context.Caller == Constants.ProfileDataCallers.ClaimsProviderIdentityToken
Run Code Online (Sandbox Code Playgroud)
或者,如果您在 api 上需要它们,您也可以在以下情况下添加它们:
context.Caller == onstants.ProfileDataCallers.ClaimsProviderAccessToken
Run Code Online (Sandbox Code Playgroud)
如果您使用RequestedClaimTypes上下文中的传递,您可以过滤掉是否请求某个身份范围。
对于访问令牌,资源范围很重要(您在这些范围上指定的声明类型将放在RequestedClaimTypes您请求的所有范围中,如果是)
context.Caller == Constants.ProfileDataCallers.ClaimsProviderAccessToken)
Run Code Online (Sandbox Code Playgroud)
如果您要求,上面都会调用两者id_token token
api如果您使用openid带有范围的引用访问令牌(必须调用,否则您没有任何信息)或者想要比主体中默认情况更多的声明(来自 jwt 访问令牌),则可以调用用户信息端点,
context.Caller == Constants.ProfileDataCallers.UserInfoEndpoint
Run Code Online (Sandbox Code Playgroud)
(这里是RequestedClaimTypes在您的访问令牌有权访问的资源范围上指定的。)。当资源范围是请求范围的一部分时,您还可以选择将它们包含在其中id_token,例如“ openid myscope”,其中 myscope 是资源(例如 api),通过启用 ' AlwaysIncludeInIdToken' 标志。
| 归档时间: |
|
| 查看次数: |
3077 次 |
| 最近记录: |