如何通过“password”grant_type从identityserver4获取id_token和access_token?

问题描述:

我正在尝试使用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”一起使用相同的“资源所有者密码凭据”流?

如何通过使用相同的“资源所有者密码凭据”流获得“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”,但不接受“用户名”和“密码”。但我必须通过所有这些参数才能获得令牌。有没有其他更好的方法来实现这一目标? –