Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何通过jquery ajax发送AntiForgeryToken(CSRF)和FormData_C#_Jquery_Ajax_Asp.net Mvc_Asp.net Mvc 5 - Fatal编程技术网

C# 如何通过jquery ajax发送AntiForgeryToken(CSRF)和FormData

C# 如何通过jquery ajax发送AntiForgeryToken(CSRF)和FormData,c#,jquery,ajax,asp.net-mvc,asp.net-mvc-5,C#,Jquery,Ajax,Asp.net Mvc,Asp.net Mvc 5,因此,我想通过AJAX将POSTfileUpload与AntiForgeryToken一起上传。这是我的密码: 看法 我明白了 无法解密防伪令牌。如果此应用程序由Web场或群集托管 通过小提琴的错误。你知道如何解决这个问题吗 我找到了答案: <script> $(document).ready(function(){ $('#btnRXUpload').click(function () { var form =

因此,我想通过AJAX将
POST
fileUpload与
AntiForgeryToken
一起上传。这是我的密码:

看法

我明白了

无法解密防伪令牌。如果此应用程序由Web场或群集托管

通过小提琴的错误。你知道如何解决这个问题吗

我找到了答案:

<script>
        $(document).ready(function(){
            $('#btnRXUpload').click(function () {
                var form = $('#frmRXUpload')

                if (form.valid()) {
                    var formData = new FormData(form.get(0)); //add .get(0)
                    formData.append('files', $('#frmRXUpload input[type="file"]')[0].files[0]);

                    $.ajax({
                        type: 'POST',
                        url: '/RX/Upload',
                        data: formData,
                        contentType: false,
                        processData: false
                    })
                }
            })
        })
    </script>

$(文档).ready(函数(){
$('#btnRXUpload')。单击(函数(){
变量形式=$(“#frmRXUpload”)
if(form.valid()){
var formData=new formData(form.get(0));//add.get(0)
formData.append('files',$('frmRXUpload input[type=“file”]')[0]。files[0]);
$.ajax({
键入:“POST”,
url:“/RX/Upload”,
数据:formData,
contentType:false,
processData:false
})
}
})
})

您需要将令牌添加到请求头,而不是表单。像这样:

        if (form.valid()) {
            var formData = new FormData(form);
            formData.append('files', $('#frmRXUpload input[type="file"]')[0].files[0]);

            $.ajax({
                type: 'POST',
                url: '/RX/Upload',
                data: formData,
                contentType: 'multipart/form-data',
                processData: false,
                headers: {
                    '__RequestVerificationToken': fnGetToken()
                } 
            })
        }
编辑 回顾我自己是如何解决这个问题的,我记得标准的ValidateAntiForgeryTokenAttribute在Request.Form对象中查找,它并不总是为AJAX请求填充。(在您的情况下,文件上载需要
多部分/表单数据
内容类型,而CSRF令牌的表单帖子需要
应用程序/x-www-form-urlencoded
。您设置了
contentType=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"]);
    }
}

更多信息(现在有点过时)

终于找到了答案:

<script>
        $(document).ready(function(){
            $('#btnRXUpload').click(function () {
                var form = $('#frmRXUpload')

                if (form.valid()) {
                    var formData = new FormData(form.get(0)); //add .get(0)
                    formData.append('files', $('#frmRXUpload input[type="file"]')[0].files[0]);

                    $.ajax({
                        type: 'POST',
                        url: '/RX/Upload',
                        data: formData,
                        contentType: false,
                        processData: false
                    })
                }
            })
        })
    </script>
我只需要在表单中添加
。获取(0)
,以下是代码:

<script>
        $(document).ready(function(){
            $('#btnRXUpload').click(function () {
                var form = $('#frmRXUpload')

                if (form.valid()) {
                    var formData = new FormData(form.get(0)); //add .get(0)
                    formData.append('files', $('#frmRXUpload input[type="file"]')[0].files[0]);
                    //formData.append('__RequestVerificationToken', fnGetToken()); //remark this line

                    $.ajax({
                        type: 'POST',
                        url: '/RX/Upload',
                        data: formData,
                        contentType: false,
                        processData: false
                    })
                }
            })
        })
    </script>

$(文档).ready(函数(){
$('#btnRXUpload')。单击(函数(){
变量形式=$(“#frmRXUpload”)
if(form.valid()){
var formData=new formData(form.get(0));//add.get(0)
formData.append('files',$('frmRXUpload input[type=“file”]')[0]。files[0]);
//append(“\uu RequestVerificationToken',fGetToken());//注释此行
$.ajax({
键入:“POST”,
url:“/RX/Upload”,
数据:formData,
contentType:false,
processData:false
})
}
})
})

什么是
fGetToken()
?如果应用程序未托管在Web场或群集上,此行为是否会改变?非ajax请求有效吗?@StephenMuecke:一个获取令牌stringYes的函数,但它返回什么?为什么不直接使用
var formdata=newformdata($('form').get(0))
根据我对您的某个问题的答案?错误消息表明它可能与令牌的某个答案有关,可以将其添加到
FormData
。如果OP的当前代码不起作用,那么这也不会起作用。
<script>
        $(document).ready(function(){
            $('#btnRXUpload').click(function () {
                var form = $('#frmRXUpload')

                if (form.valid()) {
                    var formData = new FormData(form.get(0)); //add .get(0)
                    formData.append('files', $('#frmRXUpload input[type="file"]')[0].files[0]);
                    //formData.append('__RequestVerificationToken', fnGetToken()); //remark this line

                    $.ajax({
                        type: 'POST',
                        url: '/RX/Upload',
                        data: formData,
                        contentType: false,
                        processData: false
                    })
                }
            })
        })
    </script>