在我们使用 IdentityServer 的 open api 项目中默认情况下 id token claims 中只包含以下信息
nbf: 1612880007
exp: 1612880307
iss: http://openapi_oauth-server
aud: 61d12f0b-2eb6-4569-ba3e-a9a19fa0deba
nonce: 8006ff68-00c1-4c30-8799-4f07467f42e4
iat: 1612880007
c_hash: eexEqTc_TMc8sc-uLHMH_g
s_hash: jLkR4woiL4ADl2sk5bsyJA
sid: 83583D26E163249D2CD2FBD3FCC6B8FF
sub: 0c7d310b-63cf-dd11-9e4d-001cf0cd1235
auth_time: 1612880007
idp: local
amr: pwd
请问如何增加更多 claim,比如用户名、博客地址?
试试替换IProfileService
的默认实现。
https://identityserver4.readthedocs.io/en/latest/reference/profileservice.html。
实现 IProfileService 接口可以搞定,但需要注意的是一定要把 Client 的 AlwaysIncludeUserClaimsInIdToken
设置为 true
ProfileService 相关实现代码
public class ProfileService : IProfileService
{
public async Task GetProfileDataAsync(ProfileDataRequestContext context)
{
// ...
context.IssuedClaims.Add(new Claim(JwtClaimTypes.Name, user.DisplayName));
context.IssuedClaims.Add(new Claim(JwtClaimTypes.Picture, user.AvatarName));
context.IssuedClaims.Add(new Claim(JwtClaimTypes.WebSite, user.GetBlogUrl()));
}
}
Startup 中注册 ProfileService
services.AddIdentityServer(options =>
{
// ...
})
.AddProfileService<ProfileService>();