我们有一个使用 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% 以上的情况,但我们无法确定为什么它对某些人不起作用。
想法?
谢谢!