我们有一个使用MVC3和自定义身份验证方法的网站,它根本不依赖表单身份验证 - 至少从我所知道的。在web.config中,我们设置了AntiForgeryToken没有表单身份验证
<authentication mode="None"></authentication>
并且我们从不在代码的任何地方使用/设置HttpContext.User。
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);
}
也就是说当使用@ Html.AntiForgeryToken()在某些情况下,用户获取此错误消息的问题是发生异常的地方。我们有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%以上的案例,但我们无法确定为什么它不适用于某些人。
想法?
谢谢!
如果您不使用任何身份验证,为什么要关心防伪令牌? CSRF攻击的目的是攻击者代表某个网站上的某些经过身份验证的用户执行操作。如果一个网站没有使用认证,CSRF似乎是无意义的。 –
我正在使用身份验证,而不是表单身份验证。 – pbz
你使用什么样的认证? –