gpt4 book ai didi

asp.net-mvc - 身份验证 token 和 Html.AntiforgeryToken 的上传问题(插件不发送 cookie)

转载 作者:行者123 更新时间:2023-12-02 01:31:27 25 4
gpt4 key购买 nike

前段时间我遇到了 Uploadify 插件的问题,我确实找到了此 answer 中描述的解决方案。 .

该问题的问题主要是由于 Uploadify 使用 flash 插件,而 flash 插件不与服务器端代码共享身份验证 cookie。

解决方案是使用授权属性的自定义版本(代码已在该答案中发布)。

属性 [TokenizedAuthorize] 被放置在 Controller 类上,如下所示

[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)

这个异常似乎证实了[ValidateAntiForgeryToken]正在调用属性...但我无法理解我的代码问题出在哪里。

有什么帮助吗?

编辑:

使用调试器我检查了 __RequestVerificationToken 的值表单参数,如您所见,它已正确填充 <%: Html.AntiForgeryToken() %> 中的值

alt text

编辑 2:

我还可以确认,如果我评论 [ValidateAntiForgeryToken]关于后行动一切都按预期进行

编辑 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?

最佳答案

您必须确保请求中发送的 cookie 与 __RequestVerificationToken 字段具有相同的值。通常,此 cookie 由 Html.AntiforgeryToken() 发出,并且必须在服务器上完成,因为它的值是使用服务器计算 secret 钥加密的。如果请求是由 Flash 客户端执行的,我不知道它是否发送 cookie。如果不是这种情况,您将需要手动发送。

还有一些您应该注意的事情,它们会抛出相同的异常,尽管我认为它不适用于您的情况,但值得检查。当您使用 Html.AntiforgeryToken() 帮助程序时,如果有登录用户,则他的用户名是发出的 cookie 的一部分。如果您随后尝试 POST 到用 [ValidateAntiForgeryToken] 装饰的 Controller 操作,它将验证当前登录的用户是否与发出 cookie 时的用户相同,如果不是的话会抛出这个异常。所以我看到的是人们使用 Html.AntiforgeryToken() 作为匿名用户生成一些 html 表单,然后使用 AJAX 登录用户,登录后用户提交表单 -它会失败。

关于asp.net-mvc - 身份验证 token 和 Html.AntiforgeryToken 的上传问题(插件不发送 cookie),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4257107/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com