Identity Server - 身份/资源范围 - 客户端如何获取有关用户

时间:2017-04-24 07:36:28

标签: identityserver3 claims

我已阅读Dominik关于使用Identity Server(https://leastprivilege.com/2016/12/16/identity-vs-permissions/)进行身份验证与权限建模的博客文章。由于我主要使用基于角色的授权,因此我可以将IdentityServer用作不同客户端和apis的身份验证/授权端点。

我的问题是如何正确建模身份和资源范围?客户端是否可以知道特定资源上的用户可以使用哪些角色?如果是,客户端是否只能知道所请求资源范围的用户角色(而不是所有范围的所有角色)。 据我了解这个概念,如果我通过 UserInfo 端点请求有关用户的声明,我收到的声明会被请求的身份范围内列出的claimTypes过滤。这意味着,如果客户端请求 roles 范围(具有 role claimtype的身份范围), UserInfo 端点将响应所有角色声明,包括其他应用程序。< / p>

让我们采用简单的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元素?

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

IdentityServer3和IdentityServer4之间存在差异。我的示例基于IdentityServer4。

你需要做一些事情:

  1. 定义授予IdentityResource声明权限的AllowedScopes
  2. 在客户的IdentityResource
  3. 中加入新的new IdentityResource { Name = "roles", UserClaims = { JwtClaimType.Role } }
  4. 让客户请求您的新var client = new Client { // .. other stuff AllowedScopes = { IdentityServerConstants.StandardScopes.OpenId, IdentityServerConstants.StandardScopes.Profile, "roles" } } 作为范围。
  5. 所以我做的如下:

    我定义资源的位置:

    new oidc.OidcClient({
      // .. other stuff
      scope: 'openid profile roles'
    });
    

    将我的客户定义为:

    JwtClaimType.Role

    然后在我的javascript客户端中使用以下内容:

    ClaimPrincipal

    然后,我能够在我的javascript客户端中看到我添加到http.ListenAndServeTLS的所有tls: failed to parse private key声明。

答案 1 :(得分:0)

您可以将角色放在id_token中。实施GetProfileDataAsync并在

时添加您的角色
context.Caller == Constants.ProfileDataCallers.ClaimsProviderIdentityToken, if you need them on the api you can also add them when context.Caller == onstants.ProfileDataCallers.ClaimsProviderAccessToken

如果您使用在上下文中传递的RequestedClaimTypes,则可以过滤掉是否请求某个身份范围。

对于访问令牌,资源范围很重要(对于所有请求的范围,您在这些范围上指定的声明类型将放在RequestedClaimTypes

context.Caller == Constants.ProfileDataCallers.ClaimsProviderAccessToken)

如果您要求id_token token

,两者都会在上面调用

如果您使用带有api范围的参考访问令牌(必须调用,否则您没有任何信息)或想要更多声明,openid可以调用用户信息端点比默认情况下主体(来自jwt访问令牌),

context.Caller == Constants.ProfileDataCallers.UserInfoEndpoint 

(此处RequestedClaimTypes是您的访问令牌可以访问的资源范围中指定的值。)。当资源范围是请求范围的一部分时,您也可以选择将它们包含在id_token中,例如&#34; openid myscope&#34;通过启用&#39; AlwaysIncludeInIdToken&#39;标志。

答案 2 :(得分:-1)

修复此问题,我需要将openid和配置文件范围添加到客户端;

AllowedScopes = new List<string>
                    {
                        "customAPI.read",
                        IdentityServerConstants.StandardScopes.OpenId,
                        IdentityServerConstants.StandardScopes.Profile
                    }