我已阅读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元素?
感谢您的帮助。
答案 0 :(得分:2)
IdentityServer3和IdentityServer4之间存在差异。我的示例基于IdentityServer4。
你需要做一些事情:
IdentityResource
声明权限的AllowedScopes
。IdentityResource
new IdentityResource
{
Name = "roles",
UserClaims = { JwtClaimType.Role }
}
var client = new Client
{
// .. other stuff
AllowedScopes =
{
IdentityServerConstants.StandardScopes.OpenId,
IdentityServerConstants.StandardScopes.Profile,
"roles"
}
}
作为范围。所以我做的如下:
我定义资源的位置:
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
}