在ASP.Net Core中,认证令牌应该存储在哪里?

13
我的应用程序有API部分和网站部分。在网站上,用户可以登录并从API获取JWT令牌。
我的问题是:
“我应该将该令牌存储在哪里?”
一些人说,将其存储在Cookie中(而其他人则认为“不要这样做,因为可能存在CSRF攻击”),有些人说使用HTML5 Web Storage,在ASP.Net Core中使用会话(而其他人则说“不要使用会话”)还看到一篇文章中有人将授权令牌存储在数据库中(??)。 那么,现在正确的位置是哪里呢?

你可以再详细介绍一下你的应用程序吗?它是一个单页应用程序吗? - poke
@poke 在我的情况下,这是一个MVC Web应用程序,有很多控制器和视图。 - Matthias Burger
1个回答

8

有许多控制器和许多视图的MVC-web应用程序

如果您必须在每个请求中使用令牌来验证您的MVC应用程序,我认为最好的选择是将其存储在会话cookie中,因为如果不这样做,Web浏览器不会自动发送令牌,这将非常麻烦。

现在,为了保护cookie和请求:

  • 使会话cookie(无过期日期)
  • 尽可能限制cookie的范围(域和路径)。
  • 设置安全和HttpOnly属性。
  • 设置SameSite属性。
  • 如果浏览器不支持SameSite,请使用反CSRF令牌。
  • 设置严格的X-Frame-Options。
  • 不要忘记在每个请求上验证JWT签名。
  • 加密JWT令牌以防止泄露可能导致社交工程的信息。

那个提示列表很有用,我认为这正是我寻找的,可以使我的应用程序更安全,免受攻击。所以你提到的“反跨站请求伪造令牌”就是臭名昭著的“防伪令牌”(现在,一切都对我有意义了:D)?因此,在使用防伪令牌时将令牌存储在cookie中是可以的吗? - Matthias Burger
1
只要你不搞砸处理防伪令牌的过程,是的。 - jlvaquero
如果我想将我的前端(空的asp.net core web项目+vue.js与web api后端通信)放在不同的主机上,该怎么办? @jlvaquero - lexeme
@lexeme 如果正确配置,带有JWT的cookie将发送到任何子域。如果您使用完全不同的域,则CORS允许您获得访问来自不同源服务器的选定资源的权限。 - jlvaquero
@jlvaquero 我的情况是否应该使用CSRF保护令牌?如果需要,那么如何实现? - lexeme

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接