2017-04-21 56 views
1

當用戶通過Google登錄IdentityServer4時,我想訪問電子郵件(也可能是他們的google-id),但沒有客戶端請求。所以每次都應該可以訪問,所以我可以將它放在access_token中(因爲我們的API需要用戶的電子郵件地址)。IdentityServer4:如何在沒有客戶端明確請求的情況下在access_token中包含電子郵件?

我一直在注入IProfileService,也IClaimsService,但我無法找到那裏的電子郵件。是否可以掛鉤Google-SignIn回撥,以便我可以手動訪問響應?

謝謝!

+0

從谷歌登錄返回的Id令牌已包含電子郵件,沒有你專門要求它... https://developers.google.com/identity/protocols/OpenIDConnect#obtainuserinfo – Mashton

回答

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); 
} 
相關問題