2017-01-02 31 views
4

我正在嘗試使用identityserver4構建身份提供程序應用程序;目前,我正在使用「資源所有者密碼憑證」流程,並從令牌端點返回access_token和refresh_token。如何通過「password」grant_type從identityserver4獲取id_token和access_token?

代碼段從客戶端調用TokenEndpoint

var tokenClient = new TokenClient(<TokenEndpoint>, <ClientId>, <ClientSecret>);   
var tokenResponse = await tokenClient.RequestResourceOwnerPasswordAsync(<UserName>, <password>, <Scopes>); 

我的問題是,如何讓「id_token」與「的access_token」和「refresh_token」一起使用相同的「資源所有者密碼憑據」流?

回答

8

如何通過使用相同的「資源所有者密碼憑據」流獲得「id_token」以及「access_token」和「refresh_token」流?

你不知道。

在IdentityServer4中,資源所有者密碼憑據流只提供訪問令牌。如果您還需要id令牌,則使用授權碼流程,隱式代碼流程或混合流程。

         access_token id_token refresh_token 

Resource Owner Password Credentials  yes   -   yes 

Authorization Code       yes   yes   yes 

Implicit Flow        yes   yes   - 

既然你想所有的三個標記類型,因爲你似乎是使用服務器端的代碼,授權碼流最適合。 Some kinds of Hybrid Flow也適用於你。

From the docs

的OAuth 2.0用戶資源所有者密碼授予允許客戶端發送用戶名和密碼令牌業務,並得到一個訪問令牌回來表示該用戶。

From a GitHub issue:

ID連接不指定資源所有者流量 - 僅交互式登錄在授權服務器(如代碼或隱含的流量)。所以[換句話說]沒有身份令牌 - 只有訪問令牌。

+0

謝謝@Shaun。有沒有其他方法可以從令牌端點獲取access_token和id_token? –

+0

@ codeninja.sj是的。您可以使用其中一個OpenID Connect流程。在你的情況下,授權碼流程似乎是最好的候選人。但是,如果您正在構建基於Web瀏覽器的應用程序,則需要Implicit Flow。 –

+0

授權碼流只接受「用戶名」和「密碼」,但不接受「client_id」和「client_secret」; 「隱式代碼流」。接受「client_id」和「client_secret」,但不接受「用戶名」和「密碼」。但我必須通過所有這些參數才能獲得令牌。有沒有其他更好的方法來實現這一目標? –

相關問題