我们有一个使用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%的情况,但我们无法确定为什么它对某些人不起作用。
思考?
谢谢!
答案 0 :(得分:0)
有些用户是否一直有这个问题?或者只是一些时间?此外,它是否一直适用于某些方法,或者对于相同的操作方法是否不一致?你有没有ajax电话?默认的防伪标记实现不处理AJAX调用。但是你可以编写一些自定义代码来使其工作
答案 1 :(得分:0)
您是否在表单中添加了防伪令牌?防伪令牌通过隐藏的HTML元素存储在客户端上,而不是cookie。另一个问题是他们使用的浏览器版本是什么?可以升级到最新版本吗?
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()...