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

IdentityServer4: How to include email in access_token without the client explicitly requesting it?

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

我一直在 IProfileServiceIClaimsService 中注入,但我在那里找不到电子邮件。是否可以连接到 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);
}