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



我正在使用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
  • 在初始令牌请求的范围内包括offline_access

令牌响应现在除了访问令牌外,还将包括刷新令牌。将访问令牌返回到客户端并保留刷新令牌。

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

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

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

  • 滑动过期
  • 绝对过期

如果设置了滑动过期,则刷新令牌生存期将在每次刷新后续订。

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

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

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

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

空格包含范围,如下所示:

Scopes = "scope1 scope2 offline_access scope3"

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

相关内容

最新更新