2011-11-09 123 views
5

我们有一个使用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%以上的案例,但我们无法确定为什么它不适用于某些人。

想法?
谢谢!

+0

如果您不使用任何身份验证,为什么要关心防伪令牌? CSRF攻击的目的是攻击者代表某个网站上的某些经过身份验证的用户执行操作。如果一个网站没有使用认证,CSRF似乎是无意义的。 –

+0

我正在使用身份验证,而不是表单身份验证。 – pbz

+0

你使用什么样的认证? –

回答

0

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

+0

我不知道为什么显示为答案而不是评论 –

+0

感谢您的回复! 1)有些用户似乎一直都在使用它,但我能够与之联系的一个用户有点不技术,因此我无法调查太多。我确实在日志中看到了他们的IP和错误,所以我知道这是合法的。 2)在这些页面上没有AJAX调用。我意识到这些限制,我已经在需要的地方开展工作。 – pbz

0

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

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

是的,我在表单中包含了令牌。我不知道他们使用的是什么版本,但他们使用的是Internet Explorer(根据我可以联系的一个人)。这发生在其他人身上,但不幸的是我没有登录浏览器版本。我可能不得不回去尽可能多地登录以获取更多数据。我希望以前别人遇到过这个问题。 – pbz