2017-10-05 51 views
0

我已經繼承了一個現有的項目,並且我對使用IdentityServer4很陌生,所以請耐心等待。IdentityServer4如何訪問用戶電子郵件

我得到一個令牌的GET請求如下:

http://my-identity-server/account/login?returnUrl=%2Fconnect%2Fauthorize%2Flogin%3Fclient_id%3Dmy.client%26redirect_uri%3Dhttp%253A%252F%252Flocalhost:8100/index.html%26response_type%3Dcode%2520id_token%2520token%26scope%3Dopenid%2520profile%2520MyAPI%26state%3D4bc18eac6a354ab3a6997e1b414e7f80%26nonce%3Dbc377c5bfd784f2f87b2621bd9cfeae2

然後我們試圖檢索與利用它作爲一個承載令牌的響應提供的的access_token成員信息。這似乎工作,但是這裏是我卡住的部分:

在API內部下面的代碼返回一個GUID代表登錄的用戶,而不是一個電子郵件。

Claim cl = this.User.Claims.FirstOrDefault(x => x.Type == "sub"); 

我需要更改以允許sub提供登錄用戶的電子郵件?

我已經嘗試添加電子郵件或配置文件,因爲您可以在上面看到的範圍只產生名稱爲「範圍」和價值「電子郵件」的索賠列表中的條目。

編輯

好像我需要以某種方式生成令牌時更新範圍。我在網上看到的所有示例都在內存設置中使用,因爲我從數據庫中獲取設置。當我在te API上調用userinfo端點時,我也只能訪問「sub」,例如

{ 
    "sub": "xx" 
} 

回答

1

在IdentityServer側,在你的配置類,當你定義允許的範圍,確保它包括電子郵件這樣的:

... 
AllowedScopes = new List<string> 
{ 
     IdentityServerConstants.StandardScopes.OpenId, 
     IdentityServerConstants.StandardScopes.Profile, 
     IdentityServerConstants.StandardScopes.Email 
} 
... 

然後在您的客戶端,在啓動類,你想要在範圍中包含電子郵件(在你的app.UseOpenIdConnectAuthentication方法中)。

... 
Scope = "openid profile email", 
... 

在這一點上,當您通過您的代碼在User.Identity.Claims客戶端步驟的電子郵件應該可以訪問。

現在,如果您想更進一步,並在您的客戶端應用程序(而不是Guid子程序)中使用電子郵件作爲「UserID」,那麼您可以將以下內容添加到app.UseOpenIdConnectAuthentication方法客戶端:

TokenValidationParameters = { 
     NameClaimType = "email" 
} 
+0

謝謝,我相信這是我困惑,我現有的解決方案沒有配置類的部分原因。我認爲它從數據庫中獲取所有設置。 – John

相關問題