身份服务器刷新令牌资源所有者密码凭证流

Posted

技术标签:

【中文标题】身份服务器刷新令牌资源所有者密码凭证流【英文标题】:Identity Server Refresh Token Resource Owner Password Credential Flow 【发布时间】:2017-10-08 05:01:02 【问题描述】:

我正在使用 IdentityServer 来控制对 API 的访问。我有一个单独的身份验证 API,它发出令牌并验证访问请求以保护 API。

我让用户能够通过安全的 Web 应用程序生成访问令牌。我正在使用资源所有者密码凭证流。

有没有一种方法可以在用户无需登录并请求它的情况下发出刷新令牌?或者有什么方法可以设置初始访问令牌的过期时间?

代码

这是我用来生成令牌的代码。

DiscoveryResponse disco = await DiscoveryClient.GetAsync("http://localhost:27144");
  TokenClient tokenClient = new TokenClient(disco.TokenEndpoint, "My Client", "MySecret");
  TokenResponse tokenResponse = await tokenClient.RequestResourceOwnerPasswordAsync("testUser", "testPassword");

【问题讨论】:

您能提供更多信息吗?如果您设置AllowOfflineAccess = True,IdentityServer 会自动返回refresh_token。也可以设置AccessTokenLifetime... @moritzg 我将 allowOfflineAccess 标志设置为 true,并将 absoluteRefreshTokenLifetime 设置为 31540000,这应该是一年。但是,令牌响应对象为 expiresIn 属性返回 3600。我可以看到还返回了一个 refresh_token 。我是否在授权标头中传递它? 你所说的“令牌响应对象”是指哪个令牌? @moritzg 我已经在问题中添加了代码。我说的token响应对象是我调用RequestResourceOwnerPasswordAsync()方法时返回的对象 【参考方案1】:

是的,这可以通过刷新令牌来完成。

在客户端配置上设置AllowOfflineAccess = true 在初始令牌请求的范围内包含 offline_access

令牌响应现在除了 AccessToken 之外还包括 RefreshToken。将 AccessToken 返回给客户端并保留 RefreshToken。

当需要一个新的 AccessToken 时,使用 TokenClient 上的 RequestRefreshTokenAsync 方法请求一个。这个名字令人困惑——你实际上是从 RefreshToken 请求一个新的 AccessToken。

TokenResponse refreshTokenResponse = await tokenClient.RequestRefreshTokenAsync("RefreshTokenGoesHere");

有两种方法可以管理 RefreshToken 过期。这由RefreshTokenExpiration 属性控制:

滑动到期 绝对过期

如果设置了滑动过期,则刷新令牌生命周期将在每次刷新后更新。

还有一个RefreshTokenUsage 属性,用于确定令牌是可以重复使用还是只能使用一次。如果设置为仅使用一次且具有滑动过期时间,则您只需获得一个新的 RefreshToken 以保留每个请求。

对于到期时间,有SlidingRefreshTokenLifetimeAbsoluteRefreshTokenLifetime。两者都可以模拟使用。例如,如果启用了滑动刷新令牌,则滑动到期时间可能是 30 天,而绝对到期时间可能是 1 年。这将允许用户在需要再次登录之前 30 天不活动,但如果用户保持活动状态,则可以免登录使用 1 年。

请务必注意,在所有情况下都不应将 RefreshToken 返回给用户 - 只有访问令牌应该返回。您需要一些数据存储机制来保存刷新令牌及其到期日期。

【讨论】:

#Kevin Gysberg 我们如何在范围内使用 apiname 传递 offline_access【参考方案2】:

我支持 kg743 的回答,但对于其他陷入困境的人,我相信我可以省去一些麻烦:

空格包括范围,像这样:

Scopes = "scope1 scope2 offline_access scope3"

我一直用逗号 (,) 或分号 (;) 包含它,但它对我不起作用。

【讨论】:

以上是关于身份服务器刷新令牌资源所有者密码凭证流的主要内容,如果未能解决你的问题,请参考以下文章

Oauth 刷新令牌授予类型

Oauth2 - 客户端凭证流中的长寿命令牌与重新身份验证

Spring Boot Oauth2 验证资源所有者密码凭证授予的访问令牌

身份服务器流

“资源所有者密码流程”和“客户凭证流程”之间的区别

OpenID Connect 是不是支持资源所有者密码凭证授予?