5

我们有一个使用 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);
}

那就是发生异常的地方。我们在 web.config 中定义了一个 machineKey,以防止在应用程序池回收时生成新的密钥。这并没有解决问题。

接下来我们认为可能是客户端的浏览器没有发送cookies。我们开始记录 cookie,并注意到在某些情况下会发送 RequestVerificationToken_Lw cookie,但在其他情况下则不会——即使其他 cookie,例如由 Google Analytics 制作的 cookie,也可以正常发送。可能是浏览器中的某些东西正在剥离一些 cookie 并留下其他的吗?

似乎防伪令牌取决于表单身份验证。是这样吗?在不以可靠方式使用表单身份验证时继续使用 AntiForgeryToken 的任何方式。请记住,我上面描述的方法适用于 90% 以上的情况,但我们无法确定为什么它对某些人不起作用。

想法?
谢谢!

4

2 回答 2

0

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

   @using (Html.BeginForm())
   {
      @Html.AntiForgeryToken()...
于 2011-11-18T13:54:24.043 回答
0

有些用户是否一直有这个问题?还是只是某些时候?此外,它是否始终适用于某些方法,或者对于相同的操作方法是否不一致?你有任何ajax调用吗?默认的防伪令牌实现不处理 AJAX 调用。但是你可以编写一些自定义代码来让它工作

于 2011-11-17T20:38:44.050 回答