前一段时间,我遇到了一个上传插件的问题,我在这里找到了一个解决方案
answer
.
这个问题的主要原因是Uploadify使用flash插件,flash插件不与服务器端代码共享认证cookie。
解决方案是使用Authorize属性的自定义版本(代码是在该答案中发布的)。
属性[TokenizedAuthorize]被放置在控制器类上,如下所示
[TokenizedAuthorize]
[CheckForActiveService]
public partial class DocumentController : BaseController
{
}
几天前我添加了
<%: Html.AntiForgeryToken() %>
在表单和
[ValidateAntiForgeryToken]
操作方法如下:
[HttpPost]
[ValidateAntiForgeryToken]
public virtual ActionResult Upload( HttpPostedFileBase fileData ) {
}
无论如何,我不能再上传文件到服务器。使用调试器,我可以在
TokenizedAuthorize
代码
return base.AuthorizeCore( httpContext );
我收到一个由Elmah处理的异常,上面说
System.Web.Mvc.HttpAntiForgeryException: invalid or not specified anti forgery token
in System.Web.Mvc.ValidateAntiForgeryTokenAttribute.OnAuthorization(AuthorizationContext filterContext)
in System.Web.Mvc.ControllerActionInvoker.InvokeAuthorizationFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor)
in System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName)
这个异常似乎证实了
[验证组织令牌]
正在调用属性。。。但我不明白我的代码哪里出了问题。
有什么帮助吗?
编辑
:
使用调试器,我检查了
__RequestVerificationToken
表单参数,如您所见,它正确地填充了
<%:Html.AntiForgeryToken()%>
编辑2
:
我也可以确认如果我评论
[验证组织令牌]
论诉讼后
一切如期而至
编辑3
:
由于post函数是由uploadify插件完成的ajax调用,因此使用一个小js函数将AntiForgeryToken添加到post参数中,如下代码所示
$('#fileInput').uploadify({
//other uploadify parameters removed for brevity
scriptData: AddAntiForgeryToken({ AuthenticationToken: auth }),
});
哪里
AddAntiForgeryToken()
是在母版页中定义的一个javascript函数,用于支持所有到服务器的ajax post
<%-- used for ajax in AddAntiForgeryToken() --%>
<form id="__AjaxAntiForgeryForm" action="#" method="post">
<%: Html.AntiForgeryToken() %>
</form>
// Encapsulate the Anti Forgery Token fetching
AddAntiForgeryToken = function (data) {
data.__RequestVerificationToken = $('#__AjaxAntiForgeryForm input[name=__RequestVerificationToken]').val();
return data;
};
编辑4
:
Darin
直觉是正确的。Uploadify脚本没有向服务器发送任何cookie,因此服务器无法验证AntiForgeryToken。如何在Uploadify scriptData部分中添加cookie?