IdentityServer4:如何在没有客户端明确请求的情况下将电子邮件包含在 access_token 中?
IdentityServer4: How to include email in access_token without the client explicitly requesting it?
当用户通过 Google 登录 IdentityServer4 时,我想访问电子邮件(可能还有他们的 google-id),但没有客户端请求它。所以它应该每次都可以访问,所以我可以把它放在 access_token 中(因为我们的 API 需要用户的电子邮件地址)。
我一直在 IProfileService
和 IClaimsService
中注入,但我在那里找不到电子邮件。是否可以连接到 Google-SignIn 回调以便我可以手动访问响应?
谢谢!
我通过在 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));
}
然后我通过依赖注入 ProfileService
class 并在 MyProfileService.GetProfileDataAsync
中添加声明,将声明添加到 access_token
中,如下所示:
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);
}
当用户通过 Google 登录 IdentityServer4 时,我想访问电子邮件(可能还有他们的 google-id),但没有客户端请求它。所以它应该每次都可以访问,所以我可以把它放在 access_token 中(因为我们的 API 需要用户的电子邮件地址)。
我一直在 IProfileService
和 IClaimsService
中注入,但我在那里找不到电子邮件。是否可以连接到 Google-SignIn 回调以便我可以手动访问响应?
谢谢!
我通过在 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));
}
然后我通过依赖注入 ProfileService
class 并在 MyProfileService.GetProfileDataAsync
中添加声明,将声明添加到 access_token
中,如下所示:
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);
}