ASP.NET MVC CSRF Anti-Forgery Tokens是否会过期?

kbr*_*ton 12 c# asp.net-mvc csrf asp.net-web-api asp.net-mvc-5

我正在ASP.NET MVC 5应用程序中实现CSRF防伪保护.特别是,我在ASP.NET网站上引用Mike Wasson描述的方法来保护响应AJAX请求的控制器方法,例如在WebAPI控制器中.此方法使用AntiForgery.GetTokens方法生成基于用户的加密防伪标记,然后使用AntiForgery.Validate验证提交的标记属于当前用户.

我的问题是:这些令牌是否有生存时间?它们会过期吗?如果有,它们有多长时间有用?文档是关于这个主题的静音.

我不想在我的系统中允许非过期令牌.此外,我希望在请求新令牌之前与客户端通信他们有多少时间.如果需要,我可以使用FormsAuthentication.Encrypt实现过期令牌; 但是,如果在AntiForgery类的方法中已经存在过期,那么我想省去不必要的复杂性.

小智 3

这个想法是每个易受攻击的 HTTP POST 都会生成两个令牌并直接发送到服务器。因此,如果您单击表单上的“提交”按钮,则会生成两个令牌:一个 cookie 和一个表单值,两者都基于用户凭据,请在此处阅读(写得很好的文章):http://www. asp.net/mvc/overview/security/xsrfcsrf-prevention-in-aspnet-mvc-and-web-pages

实际上可能过期的 cookie 令牌是多余的,对于系统来说不是必需的,除非尝试匿名身份验证的情况。例如,请参见此处(第一个答案): MVC 2 AntiForgeryToken - 为什么对称加密+ IPrinciple?

尽管如此,攻击者仍无法读取您的其他令牌,并且这些令牌是随每个新请求生成的。因此,无需担心过期日期。

编辑:实际上,这一切也可以在您所引用的文章的评论部分中阅读(Mike Wasson);)

  • 感谢您的答复。我了解这两个令牌如何工作的概念,并了解 HTML 表单与 AJAX 请求的微妙但不同的方法。然而,我的问题具体是令牌是否过期,文档或 Mike Wasson 帖子的评论中没有讨论这一点。干杯! (9认同)
  • @kbrimington IAntiForgeryAdditionalDataProvider 中的[上面第一篇文章](https://docs.microsoft.com/en-us/aspnet/mvc/overview/security/xsrfcsrf-prevention-in-aspnet-mvc-and-web-pages)页面底部的部分似乎暗示它没有过期时间。它说你可以实现额外的检查,并指出“验证例程可以实现超时(通过检查当前时间与创建令牌时存储的时间)、随机数检查例程或任何其他所需的逻辑。” 您是否获得过有关令牌过期的明确答案? (3认同)
  • @DavidYates,感谢您让我注意到这一点。当时,我得出的结论是它们不能过期,并且我构建了自己的过期逻辑。我不记得 2.5 年前我提出问题时的文章中出现过此部分。“IAntForgeryAdditionalDataProvider”的目的似乎是允许轻松自定义令牌及其验证逻辑,包括实现超时的能力。 (2认同)