身份服务器刷新令牌资源所有者密码凭证流
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 以保留每个请求。
对于到期时间,有 SlidingRefreshTokenLifetime
和 AbsoluteRefreshTokenLifetime
。两者都可以模拟使用。例如,如果启用了滑动刷新令牌,则滑动到期时间可能为 30 天,而绝对到期时间可能为 1 年。这将允许用户在需要再次登录之前有 30 天的不活动时间,但如果用户保持活跃,则可以免登录使用 1 年。
请务必注意,在所有情况下都不应将 RefreshToken 返回给用户 - 只有访问令牌应该返回。您需要一些数据存储机制来保留刷新令牌及其到期日期。
我支持 kg743 的回答,但对于其他卡住的人,我相信我可以省去一些麻烦:
使用 space 包含范围,如下所示:
Scopes = "scope1 scope2 offline_access scope3"
我一直用逗号 (,) 或分号 (;) 包含它,但它对我不起作用。
我正在使用 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 以保留每个请求。
对于到期时间,有 SlidingRefreshTokenLifetime
和 AbsoluteRefreshTokenLifetime
。两者都可以模拟使用。例如,如果启用了滑动刷新令牌,则滑动到期时间可能为 30 天,而绝对到期时间可能为 1 年。这将允许用户在需要再次登录之前有 30 天的不活动时间,但如果用户保持活跃,则可以免登录使用 1 年。
请务必注意,在所有情况下都不应将 RefreshToken 返回给用户 - 只有访问令牌应该返回。您需要一些数据存储机制来保留刷新令牌及其到期日期。
我支持 kg743 的回答,但对于其他卡住的人,我相信我可以省去一些麻烦:
使用 space 包含范围,如下所示:
Scopes = "scope1 scope2 offline_access scope3"
我一直用逗号 (,) 或分号 (;) 包含它,但它对我不起作用。