【问题标题】:Authentication - proper way of handling session with tokens身份验证 - 使用令牌处理会话的正确方法
【发布时间】:2019-06-15 05:46:08
【问题描述】:

我有一个连接到 ASP.NET Core WebAPI 的 ReactJS SPA 应用程序。由于 OpenIddict,API 也是一个授权服务器。我正在使用 PasswordFlowRefreshTokenFlow 来处理身份验证,这意味着服务器返回一个AccessToken 和可选的RefreshToken。目前,我很难正确处理 Remember me 功能。当用户想记住时,这没什么大不了的-服务器返回一个AccessToken和一个RefreshToken,客户端存储为LocalStorage,因此它可以在AccessToken即将到期或到期时刷新AccessToken使用RefreshToken 很好 - 网络上有很多文章和其他有用的资源。当用户不想被记住时,问题就来了。这种情况如何处理身份验证?我看到的两个解决方案是:

  • 服务器只发出一个AccessToken,客户端存储在SessionStorage中。如果过期 - 客户端强制用户重新输入他的凭据以获取新的AccessTokenAccessTokens 应该是短暂的(根据我目前所了解到的,它可以从一个到几个小时,但它的有效期越长,它在被盗的情况下就越不安全。如果持续一个小时后用户仍在使用该应用程序,强制他/她再次登录似乎有点奇怪。
  • 服务器返回AccessTokenRefreshToken,客户端将其存储在SessionStorage中。在会话期间,如果AccessToken 即将到期,客户端可以使用RefreshToken 获取新的。这是有风险的,而且服务器永远不会知道用户关闭了他的浏览器并且他/她的RefreshToken 应该被撤销。假设RefreshTokens 的寿命更长,这似乎真的很冒险。

如果您对此主题有任何想法、建议和见解,我将不胜感激。 谢谢!

【问题讨论】:

  • 作为一般安全规则,您永远不应该向客户端提供或存储刷新令牌。刷新令牌仅适用于 3-legged OAuth,这意味着服务器管理刷新令牌而不是客户端。记住我应该在服务器而不是在客户端完成。
  • 另一个项目。要刷新访问令牌,您需要三个项目。客户端 ID、客户端密码和刷新令牌。您永远不会向客户端公开客户端密钥。客户 ID 被视为公共信息。使用客户端 ID 和客户端密码,我可以使用您的帐户创建 OAuth 令牌。您将在身份验证系统中暴露出巨大的安全漏洞。如果没有客户端密码,您将无法刷新访问令牌或 ID 令牌。

标签: authentication oauth-2.0 access-token openid-connect refresh-token


【解决方案1】:

如果你是新手,这些东西很难理解,但大多数实现都是这样工作的:

  • SPA 通过第 3 方库使用 Open Id Connect Implicit Flow
  • 用户从 SPA 重定向到第 3 方授权服务器进行登录
  • 登录过程完全从您的应用外部化
  • 登录后,授权服务器会向您的 SPA 返回一个令牌
  • SPA 使用访问令牌调用 API

PS:我有一个code sample 和一些written guidance,你可能会觉得有用。

更多帖子描述了静默令牌更新对于 SPA 的工作原理,正如 John 在上面指出的那样,SPA 不使用刷新令牌。

【讨论】:

    猜你喜欢
    • 2014-04-15
    • 1970-01-01
    • 2020-09-29
    • 2014-06-08
    • 1970-01-01
    • 2019-12-02
    • 2016-10-18
    • 1970-01-01
    • 2017-03-21
    相关资源
    最近更新 更多