MVC3 远程验证和防伪标记

4

阅读有关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个回答

6
在 remote 属性中,请按以下方式操作:
[Remote("MyValidationMethod","MyController", HttpMethod = "POST", AdditionalFields = "__RequestVerificationToken")]
public object MyField { get; set; }

AdditionalFields属性可以接受以逗号分隔的字段名称,格式为;__RequestVerificationToken是包含AntiForgeryToken的隐藏字段的名称。


0

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

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

您可以从控制器中删除反伪造令牌属性,并将其与远程验证操作以外的其他操作一起使用,或者只在真正需要时使用它。

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

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

    [ValidateAntiForgeryToken]
    public ActionResult valdaitionaction () 
    { }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接