如何使用带有refresh_token的Oauth 2.0实现“记住我”功能?

时间:2019-05-27 12:03:37

标签: javascript c# security oauth-2.0

我已经阅读了很多材料,包括OAuth 2.0的RFC,以使用该协议进行安全登录。我实现的流程是授权代码授予,因为我有一个安全的NET CORE后端来存储客户端机密。我已经按照RFC或其他Oauth 2.0实施工作流程表中的说明实施了该协议。

目前,我拥有access_token和refresh_token,但是我希望实现记住我的功能。我以不同的方式思考它,但是我不知道如何以安全的方式实现它。

如果我通过服务器将刷新保存在浏览器的http安全cookie中,则我很容易受到CSRF攻击,如果将其保存在本地存储中,则更糟,因为我容易受到XSS攻击,会被偷。

简而言之,我需要缓解XSS和CSRF漏洞,并具有“记住我”功能。 (我还考虑过使用浏览器的同一站点cookie属性来缓解CSRF漏洞,但是我需要获得背对背的兼容性,并且该功能仅在最新版本的浏览器中可用。)

我的问题是:如何在记住安全性的同时实现记住我的功能?

1 个答案:

答案 0 :(得分:0)

如果您的应用程序具有XSS漏洞,则将令牌保留在内存中(变量)还是保留在localStorage中都没有关系。恶意代码访问时不会有问题。因此,我认为在localStorage中保留“记住我”信息不会降低您当前的安全级别。为了保护您的应用程序免受XSS攻击,您可以使用诸如内容安全策略之类的内容,以便仅执行您信任的JavaScript代码。有关更多信息,请参见OWASP XSS prevention cheat sheet

我认为您可以将访问令牌保留在sessionStorage中而不是变量中,以便用户在重新加载页面时不必登录。

如果将“记住我”信息存储在仅HTTP的cookie中,则可能会使您的应用程序容易受到CSRF攻击,但是同样,有一些方法可以阻止它(OWASP CSRF prevention),例如CORS和发送每个请求中都有一个额外的令牌,需要通过JavaScript代码从cookie中读取。

“记住我”功能可能会增加某种风险,因为用户长时间保持登录状态。因此,您需要评估风险与用户便利之间的平衡。

您可以查看OAuth 2.0 for Browser-Based Apps。它没有讨论“记住我”功能,但是讨论了良好做法和安全注意事项。