通过OpenID Connect通过资源所有者密码授予获取访问令牌和基本用户信息的标准实现

时间:2019-02-18 09:03:24

标签: asp.net-core identityserver4 openid-connect azure-ad-b2c onelogin

我想验证用户的用户名和密码,并且成功后,我想使用令牌获取基本的用户信息。

授予类型为具有OpenID Connect的“资源所有者密码”授予。

但是,在各种身份提供者中实现此方法的方式有所不同。例如,OneLogin需要两个请求才能获取基本用户信息。同时,Azure AD B2C和IdentityServer4需要一个请求。

哪个实现是OpenID Connect的标准?如果将OneLogin用于我的项目,可以使用哪些最佳实践来实现平台可移植性?

OneLogin:

首次请求:

获取令牌

网址:https://openid-connect.onelogin.com/oidc/token

参考:https://developers.onelogin.com/openid-connect/api/password-grant

结果:

{
"access_token": "example",
"expires_in": 2313232,
"token_type": "Bearer",
"refresh_token": "example"
}

第二个请求:

获取用户信息

URL:https://openid-connect.onelogin.com/oidc/me

参考:https://developers.onelogin.com/openid-connect/api/user-info

结果:

{
"sub": "123",
"email": "my@lmail.com",
"preferred_username": "my@email.com",
"name": "My Name",
"updated_at": "2019-03-13T16:11:15Z",
"given_name": "My",
"family_name": "Name"
}

2 个答案:

答案 0 :(得分:0)

这部分归因于OAuth2中围绕令牌定义的“开放”定义。在Azure AD中,访问令牌是提供基本用户信息的JWT。获取访问令牌(通过任何一种授权类型),您便拥有基本的用户信息。在Onelogin(和其他IDP,例如Salesforce)中,访问令牌只是一个不透明的令牌,不包含可识别的数据。这是访问资源的令牌。

因此,这里没有标准,但是如果您要寻找一致性,则应假定来自任何IdP的访问令牌都不包含用户信息。启动返回OIDC令牌的授权,或使用访问令牌请求并返回用户信息的API端点。请注意,“资源所有者密码授予”应具有openid范围,应返回一个id_token,其中包含您的基本用户信息。

此(新工具)也应有助于阐明 https://youtu.be/do0agd71hE8

答案 1 :(得分:0)

我建议通常将身份令牌发送到资源服务器(通常是您的api服务器)(由于您打算将它带入其中,因此您想确保此身份?)。由于身份令牌是JWT,可以在资源服务器上的每次调用中对其进行本地验证/ api服务器。最初,您可以使用opaque承载令牌从userinfo_endpoint获取有关用户的信息。由于承载令牌是不透明的,因此几乎没有任何将令牌传递到api /资源服务器的方法,因为您无法对其进行验证。 讨论IdToken vs AccessToken sent to Resource Server 将id令牌发送到资源服务器是不正常的,但是由于承载令牌是不透明的,并且无法在本地进行验证,因此您别无选择