如何通过“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也适用于你。
的OAuth 2.0用户资源所有者密码授予允许客户端发送用户名和密码令牌业务,并得到一个访问令牌回来表示该用户。
ID连接不指定资源所有者流量 - 仅交互式登录在授权服务器(如代码或隐含的流量)。所以[换句话说]没有身份令牌 - 只有访问令牌。
谢谢@Shaun。有没有其他方法可以从令牌端点获取access_token和id_token? –
@ codeninja.sj是的。您可以使用其中一个OpenID Connect流程。在你的情况下,授权码流程似乎是最好的候选人。但是,如果您正在构建基于Web浏览器的应用程序,则需要Implicit Flow。 –
授权码流只接受“用户名”和“密码”,但不接受“client_id”和“client_secret”; “隐式代码流”。接受“client_id”和“client_secret”,但不接受“用户名”和“密码”。但我必须通过所有这些参数才能获得令牌。有没有其他更好的方法来实现这一目标? –