2010-01-14 147 views
4

我有一个HTML表单,我向其中动态添加一个文本字段并通过jQuery向ASP.NET MVC控制器执行POST请求。ValidateAntiForgeryToken与jQuery ajax表单提交失败

如果我在控制器操作中调用没有ValidateAntiForgeryToken属性的POST请求,它可以正常工作。但是,当我将ValidateAntiForgeryToken属性添加到操作中时,我会看到以下例外情况:

“未提供所需的防伪标记或无效。”

有没有人有任何想法,为什么这可能是?

需要注意的一点是,Cookie中的标记ID看起来与表单中呈现的标记完全不同。为什么这些会有所不同?

行动:

[AcceptVerbs(HttpVerbs.Post)] 
[ValidateAntiForgeryToken] 
public string MyAction(Guid id, Dto dto) 
{    
    //return JSON; 
} 

的形式(渲染):

<form id="slider" class="fc" method="post" action="/controller/myaction/" name="tabEdit"> 
    <span id="slider_previous" class="sprite" tabindex="0" title="foo">Previous</span> 
    <input type="hidden" value="mzyg7UWQrHwafoSuoJBvwfraQEtCTAmM9QHYeyMSrAHFHG10BNXM+I2yNgz8zQ8yu/E43eF3yMuHX7YIQwmK3Q==" name="__RequestVerificationToken"/> 
    <div id="sliderWrap" style="width: 31.243%;"> 
    <ul class="sliderList"> 
     <li id="ID_3d031daf-a7f9-46f2-b4b9-7c9fc6560e3d"> 
     </li> 
     <li id="ID_78b61634-d88a-4f33-8e48-e0655ad8a958" class="current"> 
     <input class="sliderInput" type="text" value="" name="Bar"/> 
     <a class="sprite" href="https://stackoverflow.com/a/b/78b61634-d88a-4f33-8e48-e0655ad8a958">Delete</a> 
     </li> 
    </ul> 
    </div> 
<span id="slider_addNew" class="sprite" tabindex="0" title="Add new">New</span> 
<span id="slider_next" class="sprite" tabindex="0" title="See next">Next</span> 
</form> 

原始视图渲染防伪标记:

<form id="slider" class="fc" method="post" action="/controller/myaction/" name="tabEdit"> 
<%=Html.AntiForgeryToken(OurNamespace.MVC.Constants.SaltValue) %> 
    <ul class="noJs"> 
<!-- etc -->  
    </ul> 
</form> 

回答

5

您指定自定义当您生成AntiForgeryToken时,您需要将此盐提供给ValidateAntiForgeryToken attribut也是。

[ValidateAntiForgeryToken(Salt=OurNamespace.MVC.Constants.SaltValue)] 
+0

谢谢,谢谢,谢谢。这一次我浪费了几个小时。 – Ben 2010-01-14 22:48:20

+0

如果您不显示自定义盐,该怎么办? – 2012-11-27 16:50:52