带有存储在 cookie 中的刷新令牌的 SPA - 如何使用 IdentityServer4 进行配置?
SPA with refresh tokens stored in cookie - how to configure with IdentityServer4?
我有一个 SPA,它使用长期独立的 JWT 与 API 通信以进行身份验证。
SPA 当前正在本地存储中存储此 JWT。
除了从安全角度来看这非常糟糕之外,另一个主要问题是我有办法撤销对 API 的访问(顺便说一句,需要保持无状态)。一个用户拥有一个令牌,他们可以无限期地使用它。
我想开始使用刷新令牌。我知道这些通常不推荐用于 SPA,但是在阅读后 The Ultimate Guide to handling JWTs on frontend clients 我相信有一种方法可以安全地做到这一点。
我想要什么:
- 当用户登录(密码授予)时,服务器仅以短暂 access_token 响应,但会设置一个带有刷新令牌的 HttpOnly cookie。
- 客户端将 access_token 存储在内存中,并在发出 API 请求时使用它。
- 当 access_token 即将到期时,我会向身份验证服务器请求刷新令牌。因为 cookie 是由 auth 服务器设置的,所以它会自动包含在请求中。服务器以更新后的 access_token 响应,我们将其存储在内存中。
- 如果用户离开 SPA 并且 returns 之后,我们可以简单地向 auth 服务器发出请求以刷新令牌,这会为我们提供一个全新的令牌(无需在中存储任何内容)本地存储)。
这似乎是最安全的选项,最大限度地减少了 XRSF 和 CSRF:
- 如果有人设法将一些代码注入 SPA 并窃取 access_token,它无论如何都会在 5 分钟后过期。注入的代码永远无法访问 refresh_token.
- 您不能诱使用户发出 CSRF API 请求,因为您没有 access_token(访问令牌有效地用作 CSRF 令牌)。
- 如果有人以某种方式设法获得了对 refresh_token 的访问权限,则可以在授权服务器上将其撤销。
如果这个方法像我认为的那样充分证明(请证明我错了!),为什么网上很少提到它?
IdentityServer4 文档似乎没有涵盖这一点。有人可以建议如何实施吗?我希望可能有一个 属性 我可以按照 UseCookiesForRefresh
的方式在客户端配置中设置,但没有。
您可以使用 ReferenceToken 类型而不是 Jwt Token 来在用户会话结束(或注销)时撤销令牌。 Reference Token
您需要更改客户端配置中的 AccessTokenType
new Client
{
ClientName = "OAuth Test",
ClientId = "TestClientId",
AllowedGrantTypes = GrantTypes.Hybrid,
AccessTokenLifetime = 300,
AllowOfflineAccess = true,
AccessTokenType = AccessTokenType.Reference,
......
}
当用户注销时,您可以使用以下行来撤销该会话中生成的所有令牌。
await _interaction.RevokeTokensForCurrentSessionAsync();
我有一个 SPA,它使用长期独立的 JWT 与 API 通信以进行身份验证。
SPA 当前正在本地存储中存储此 JWT。
除了从安全角度来看这非常糟糕之外,另一个主要问题是我有办法撤销对 API 的访问(顺便说一句,需要保持无状态)。一个用户拥有一个令牌,他们可以无限期地使用它。
我想开始使用刷新令牌。我知道这些通常不推荐用于 SPA,但是在阅读后 The Ultimate Guide to handling JWTs on frontend clients 我相信有一种方法可以安全地做到这一点。
我想要什么:
- 当用户登录(密码授予)时,服务器仅以短暂 access_token 响应,但会设置一个带有刷新令牌的 HttpOnly cookie。
- 客户端将 access_token 存储在内存中,并在发出 API 请求时使用它。
- 当 access_token 即将到期时,我会向身份验证服务器请求刷新令牌。因为 cookie 是由 auth 服务器设置的,所以它会自动包含在请求中。服务器以更新后的 access_token 响应,我们将其存储在内存中。
- 如果用户离开 SPA 并且 returns 之后,我们可以简单地向 auth 服务器发出请求以刷新令牌,这会为我们提供一个全新的令牌(无需在中存储任何内容)本地存储)。
这似乎是最安全的选项,最大限度地减少了 XRSF 和 CSRF:
- 如果有人设法将一些代码注入 SPA 并窃取 access_token,它无论如何都会在 5 分钟后过期。注入的代码永远无法访问 refresh_token.
- 您不能诱使用户发出 CSRF API 请求,因为您没有 access_token(访问令牌有效地用作 CSRF 令牌)。
- 如果有人以某种方式设法获得了对 refresh_token 的访问权限,则可以在授权服务器上将其撤销。
如果这个方法像我认为的那样充分证明(请证明我错了!),为什么网上很少提到它?
IdentityServer4 文档似乎没有涵盖这一点。有人可以建议如何实施吗?我希望可能有一个 属性 我可以按照 UseCookiesForRefresh
的方式在客户端配置中设置,但没有。
您可以使用 ReferenceToken 类型而不是 Jwt Token 来在用户会话结束(或注销)时撤销令牌。 Reference Token
您需要更改客户端配置中的 AccessTokenType
new Client
{
ClientName = "OAuth Test",
ClientId = "TestClientId",
AllowedGrantTypes = GrantTypes.Hybrid,
AccessTokenLifetime = 300,
AllowOfflineAccess = true,
AccessTokenType = AccessTokenType.Reference,
......
}
当用户注销时,您可以使用以下行来撤销该会话中生成的所有令牌。
await _interaction.RevokeTokensForCurrentSessionAsync();