AntiForgeryToken没有表单身份验证

时间:2011-11-09 20:16:46

标签: asp.net-mvc-3 antiforgerytoken

我们有一个使用MVC3的网站和一个完全不依赖于表单身份验证的自定义身份验证方法 - 至少从我能说的内容来看。在web.config中我们设置

<authentication mode="None"></authentication>

我们从不在代码中的任何地方使用/设置HttpContext.User。问题是在某些情况下使用@ Html.AntiForgeryToken()时,用户会收到此错误消息:

A required anti-forgery token was not supplied or was invalid

我们使用以下代码集中了OnAuthorization中的所有反伪造检查:

if (String.Compare(filterContext.HttpContext.Request.HttpMethod, "post", true) == 0)
{
  var forgery = new ValidateAntiForgeryTokenAttribute();
  forgery.OnAuthorization(filterContext);
}

这就是异常发生的地方。我们有defined a machineKey in web.config来防止在应用程序池回收时生成新密钥。这并没有解决问题。

接下来我们认为客户的浏览器可能没有发送cookie。我们开始记录cookie并注意到在某些情况下会发送RequestVerificationToken_Lw cookie,但在其他情况下则不会 - 尽管其他cookie(如Google Analytics提供的cookie)也会被发送。可能是浏览器中的某些内容正在剥离一些cookie并将其他人留在哪里?

好像是anti-forgery token depends on forms authentication。是这样的吗?任何方式在不以可靠的方式使用表单身份验证时继续使用AntiForgeryToken。请记住,我上面描述的方法适用于超过90%的情况,但我们无法确定为什么它对某些人不起作用。

思考?
谢谢!

2 个答案:

答案 0 :(得分:0)

有些用户是否一直有这个问题?或者只是一些时间?此外,它是否一直适用于某些方法,或者对于相同的操作方法是否不一致?你有没有ajax电话?默认的防伪标记实现不处理AJAX调用。但是你可以编写一些自定义代码来使其工作

答案 1 :(得分:0)

您是否在表单中添加了防伪令牌?防伪令牌通过隐藏的HTML元素存储在客户端上,而不是cookie。另一个问题是他们使用的浏览器版本是什么?可以升级到最新版本吗?

   @using (Html.BeginForm())
   {
      @Html.AntiForgeryToken()...