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

Identity Server Refresh Token Resource Owner Password Credential Flow

我正在使用 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 之外,令牌响应现在还包括 RefreshToken。 Return AccessToken 到客户端并持有 RefreshToken。

当需要新的 AccessToken 时,使用 TokenClient 上的 RequestRefreshTokenAsync 方法请求一个。该名称令人困惑 - 您实际上是从 RefreshToken 请求一个新的 AccessToken。

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

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

控制的
  • 滑动到期
  • 绝对到期

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

还有一个 RefreshTokenUsage 属性,它确定令牌是可以重复使用还是只能使用一次。如果设置为一次性使用且过期滑动,您将简单地获得一个新的 RefreshToken 以保留每个请求。

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

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

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

使用 space 包含范围,如下所示:

Scopes = "scope1 scope2 offline_access scope3"

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