MVC3远程验证和AntiForgeryToken

时间:2011-07-18 14:09:14

标签: asp.net-mvc asp.net-mvc-3 attributes xss antiforgerytoken

在阅读有关XSS攻击后,我已使用本文中描述的ValidateAntiForgeryTokenWrapperAttribute将AntiForgeryToken应用于我的网站:

http://weblogs.asp.net/dixin/archive/2010/05/22/anti-forgery-request-recipes-for-asp-net-mvc-and-ajax.aspx

它似乎运行良好但是我在MVC3中使用远程验证时遇到了问题。我有一个ValidationController,其中包含我网站中的所有常见验证,如果我将ValidateAntiForgeryTokenWrapperAttribute应用于它,那么远程验证不再有效,我得到一个'所提供的必需的防伪令牌未被提供或无效。'在Elmah中记录的异常。我试过调试它,它甚至没有在抛出异常之前点击控制器动作。我认为这是因为远程验证不知道将AntiForgeryToken传递给控制器​​ - 是否有其他人遇到过这个问题或者知道这两个是不是一起使用?

它还让我怀疑我是否应该在每个控制器上使用ValidateAntiForgeryTokenWrapperAttribute,是否有任何想法?

2 个答案:

答案 0 :(得分:3)

在远程属性中执行以下操作:

[Remote("MyValidationMethod","MyController", HttpMethod = "POST", AdditionalFields = "__RequestVerificationToken")]
public object MyField { get; set; }

AdditionalFields属性可以接受表单中逗号分隔的字段名称; __RequestVerificationToken是包含AntiForgeryToken的隐藏字段的名称。

答案 1 :(得分:0)

我没有使用远程验证。但是我和AntiForgeryToken有类似的经历。当我将它应用于我的控制器中的所有操作时。后来,我将其从所有操作中删除,并仅应用于将数据发送回数据库的那些操作(插入/更新/删除)。

由于您似乎已将AntiForgeryToken验证属性应用于整个控制器,因此每次执行操作时它都会始终创建新的令牌值,因此当响应返回客户端进行远程验证操作时,令牌的值不同于在稍后提交以进行其他操作的表单上。

您可以从控制器中删除AntiForgeryToken属性,并将其与远程验证操作或您真正需要的其他操作一起使用。

//Instead of this
[ValidateAntiForgeryToken]
public class mycontroller
{
//...
}    

//Do something like this
public class mycontroller
{    
    public ActionResult myotheraction () 
    { }

    [ValidateAntiForgeryToken]
    public ActionResult valdaitionaction () 
    { }
}