IdentityServer4:如何在没有客户明确请求的情况下在access_token中包含电子邮件?

时间:2017-04-21 13:56:56

标签: oauth oauth-2.0 google-oauth openid identityserver4

当用户通过Google登录IdentityServer4时,我想访问该电子邮件(可能是他们的google-id),但没有客户端请求它。所以它应该每次都可以访问,所以我可以把它放在access_token中(因为我们的API需要用户的电子邮件地址)。

我已注入IProfileServiceIClaimsService,但我无法在那里找到该电子邮件。是否可以挂钩到Google-SignIn Callback,以便我可以手动访问响应?

谢谢!

1 个答案:

答案 0 :(得分:0)

我通过在AccountController.ExternalLoginCallback中添加我需要的声明来解决这个问题:

//Add E-Mail claim even if client didn't ask for it
if (claims.Exists(c => c.Type.Equals(ClaimTypes.Email))) {
    additionalClaims.Add(new Claim(JwtClaimTypes.Email, claims.FirstOrDefault(x => x.Type.Equals(ClaimTypes.Email)).Value));
}

然后我通过依赖注入我的access_token类并在ProfileService中添加声明,将MyProfileService.GetProfileDataAsync声明添加到public Task GetProfileDataAsync(ProfileDataRequestContext context) { var claims = new List<Claim>(); Claim emailClaim = context.Subject.Claims.Where<Claim>(claim => claim.Type.Equals(JwtClaimTypes.Email)).FirstOrDefault(); if (emailClaim != null) { claims.Add(emailClaim); } context.IssuedClaims = claims; return Task.FromResult(0); }

Foo.execSomething(k,v).then(function(){/*do nothing*/},(err) => {
  console.log(err)
}).catch((err) => {
  console.log(err)
});