Javascript 如何将AntiforgeryToken与dropzone.js一起使用,如何将MVC 5与Vanilla js一起使用?

Javascript 如何将AntiforgeryToken与dropzone.js一起使用,如何将MVC 5与Vanilla js一起使用?,javascript,asp.net-mvc,dropzone.js,Javascript,Asp.net Mvc,Dropzone.js,我现在正试图弄清楚如何使用Dropzone.js和vanilla javascript(无jQuery)发送antiforgery令牌 这是我目前的初始化代码: $(document).ready(function (e) { var myDropzone = new Dropzone("#myDropzone", { url: "/Media/AjaxUpload", maxFilesize: 10, addRemoveLinks: true, maxFiles: 1 });

我现在正试图弄清楚如何使用Dropzone.js和vanilla javascript(无jQuery)发送antiforgery令牌

这是我目前的初始化代码:

$(document).ready(function (e) {
        var myDropzone = new Dropzone("#myDropzone", { url: "/Media/AjaxUpload", maxFilesize: 10, addRemoveLinks: true, maxFiles: 1 });
        myDropzone.on("success", function (response) {
            //Do some personal stuff.
        });
        myDropzone.on("sending", function (xhr, formData) {
            formData["__RequestAntiForgeryToken"] = document.getElementsByName("__RequestVerificationToken")[1].value
        });

    });

我已经尝试在Dropzone的发送事件中添加令牌,但没有任何效果,即使在标题处也是如此。对如何实现这一目标有何建议

我最终实现这一目标的方式是通过Stackoverflow的许多建议。我在MVC上创建了一个特殊的过滤器,并通过头传递了令牌。像这样:

从这里开始:

我设法通过dropzone的标头发送令牌:

代码的结尾是这样的:

var myDropzone = new Dropzone("#myDropzone", {
            url: "/Media/AjaxUpload", maxFilesize: 10, addRemoveLinks: true, maxFiles: 1,
            headers: { "__RequestVerificationToken": document.getElementsByName("__RequestVerificationToken")[1].value }
        });
我在Dropzone实例化中添加了“headers”,并在MVC中添加了过滤器:

  [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple= false, Inherited = false)]
public sealed class ValidateJsonAntiForgeryTokenAttribute : FilterAttribute, IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationContext filterContext)
    {
        if (filterContext == null)
        {
            throw new ArgumentNullException("filterContext");
        }

        var httpContext = filterContext.HttpContext;
        var cookie = httpContext.Request.Cookies[AntiForgeryConfig.CookieName];
        AntiForgery.Validate(cookie != null ? cookie.Value : null,
                             httpContext.Request.Headers["__RequestVerificationToken"]);
    }
}
然后应用于控制器:

 [ValidateJsonAntiForgeryToken]
    public JsonResult AjaxUpload(HttpPostedFileBase file)
    {
        //Do Logic here!

        return Json("Success");
}

我想你一开始就差点把它钉死,何塞。您犯的一个小错误是事件处理程序函数中缺少一个参数

从:

在发送每个文件之前调用。获取xhr对象和 将数据对象格式化为第二个和第三个参数,以便可以修改 它们(例如添加CSRF令牌)或添加其他数据

事件参数实际上是
file、xhr、formData
,如果将这三个参数都包括在内,则可以成功地操作表单。这样做的好处是不需要创建自定义属性,只需使用
ValidateAntiForgeryToken
属性即可

myDropzone.on("sending", function (file, xhr, formData) {
    formData["__RequestAntiForgeryToken"] = document.getElementsByName("__RequestVerificationToken")[1].value;
});

我已经用一种与你的稍有不同的方法测试了这个,它运行得很好

对我来说,使用
formData.append(“\uu RequestAntiForgeryToken”,tokenElement)”也有效。对我来说,它只适用于
formData.append(k,v)
不适用于
formData[k]=v
,它必须是
\uu RequestVerificationToken
而不是
\uu RequestAntiForgeryToken
(asp.net core 3)都德,这是黄金!的确是一件珍宝。做得好。我发现dropzone正在将头负载中的uu RequestVerificationToken设置为小写,而MVC失败了。很奇怪。。。