身份验证 - 使用令牌处理会话的正确方法
Authentication - proper way of handling session with tokens
我有一个连接到 ASP.NET Core WebAPI 的 ReactJS SPA 应用程序。由于 OpenIddict,API 也是一个授权服务器。我正在使用 PasswordFlow 和 RefreshTokenFlow 来处理身份验证,这意味着服务器 returns 一个 AccessToken
和可选的 RefreshToken
。此时此刻,我正在努力正确处理 Remember me 功能。当用户想要记住时,这没什么大不了的 - 服务器 returns 一个 AccessToken
和客户端存储的 RefreshToken
是 LocalStorage
,因此它可以刷新 AccessToken
当它即将过期或使用 RefreshToken
过期时,这很好 - 网上有很多文章和其他有用的资源。当用户不想被记住时,问题就来了。这种情况下如何处理身份验证?我看到的两个解决方案是:
- 服务器只发出一个
AccessToken
,客户端存储在SessionStorage
中。如果它过期 - 客户端强制用户重新输入他的凭据以获得新的 AccessToken
。 AccessTokens
应该是短暂的(根据我目前的了解,它可以从一个到几个小时,但是它有效的时间越长,它在获取时的情况下就越不安全被盗。如果它持续了一个小时之后用户仍然使用该应用程序,强制 him/her 重新登录似乎有点奇怪。
- 服务器returns一个
AccessToken
和一个RefreshToken
,客户端存储在SessionStorage
中。在会话期间,如果 AccessToken
即将过期,客户端可以使用 RefreshToken
获取新的。这是有风险的,因为服务器永远不会知道用户关闭了他的浏览器并且 his/hers RefreshToken
应该被撤销。假设 RefreshTokens
有更长的生命周期,这似乎真的很冒险。
如果您对此主题有任何想法、建议和见解,我将不胜感激。
谢谢!
如果你是新手,这些东西很难理解,但大多数实现都是这样的:
- SPA 使用 Open Id Connect Implicit Flow 通过第三方库
- 用户从 SPA 重定向到第 3 方授权服务器以登录
- 登录过程完全从您的应用外部化
- 登录授权服务器后returns您的 SPA 令牌
- SPA 使用访问令牌
调用API
PS:我有一个 code sample and some written guidance 你可能会觉得有用。
更多帖子描述了 SPA 的静默令牌续订的工作原理,正如 John 在上面指出的那样,SPA 不使用刷新令牌。
我有一个连接到 ASP.NET Core WebAPI 的 ReactJS SPA 应用程序。由于 OpenIddict,API 也是一个授权服务器。我正在使用 PasswordFlow 和 RefreshTokenFlow 来处理身份验证,这意味着服务器 returns 一个 AccessToken
和可选的 RefreshToken
。此时此刻,我正在努力正确处理 Remember me 功能。当用户想要记住时,这没什么大不了的 - 服务器 returns 一个 AccessToken
和客户端存储的 RefreshToken
是 LocalStorage
,因此它可以刷新 AccessToken
当它即将过期或使用 RefreshToken
过期时,这很好 - 网上有很多文章和其他有用的资源。当用户不想被记住时,问题就来了。这种情况下如何处理身份验证?我看到的两个解决方案是:
- 服务器只发出一个
AccessToken
,客户端存储在SessionStorage
中。如果它过期 - 客户端强制用户重新输入他的凭据以获得新的AccessToken
。AccessTokens
应该是短暂的(根据我目前的了解,它可以从一个到几个小时,但是它有效的时间越长,它在获取时的情况下就越不安全被盗。如果它持续了一个小时之后用户仍然使用该应用程序,强制 him/her 重新登录似乎有点奇怪。 - 服务器returns一个
AccessToken
和一个RefreshToken
,客户端存储在SessionStorage
中。在会话期间,如果AccessToken
即将过期,客户端可以使用RefreshToken
获取新的。这是有风险的,因为服务器永远不会知道用户关闭了他的浏览器并且 his/hersRefreshToken
应该被撤销。假设RefreshTokens
有更长的生命周期,这似乎真的很冒险。
如果您对此主题有任何想法、建议和见解,我将不胜感激。 谢谢!
如果你是新手,这些东西很难理解,但大多数实现都是这样的:
- SPA 使用 Open Id Connect Implicit Flow 通过第三方库
- 用户从 SPA 重定向到第 3 方授权服务器以登录
- 登录过程完全从您的应用外部化
- 登录授权服务器后returns您的 SPA 令牌
- SPA 使用访问令牌 调用API
PS:我有一个 code sample and some written guidance 你可能会觉得有用。
更多帖子描述了 SPA 的静默令牌续订的工作原理,正如 John 在上面指出的那样,SPA 不使用刷新令牌。