2015-09-25 7 views
5

के माध्यम से FormData के साथ AntiForgeryToken (CSRF) को कैसे भेजें, इसलिए मैं POST फ़ाइल AntiForgeryToken के साथ AJAX के माध्यम से अपलोड करना चाहता हूं।jquery AJAX

देखें

@using (Html.BeginForm("Upload", "RX", FormMethod.Post, new {id = "frmRXUpload", enctype = "multipart/form-data"})) 
{ 
    @Html.AntiForgeryToken() 
    @Html.TextBoxFor(m => m.RXFile, new {.type = "file"}) 
    ...rest of code here 
} 

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

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

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

नियंत्रक

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Upload() 
{ 
    //rest of code here 
} 

मैं

विरोधी जालसाजी टोकन decrypted नहीं किया जा सका मिलती है: यहाँ मेरी कोड है। यदि यह एप्लिकेशन वेब फार्म या क्लस्टर

फिडलर के माध्यम से त्रुटि द्वारा होस्ट किया गया है। इस मुद्दे को हल करने का कोई विचार है?

<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

क्या है 'fnGetToken()'? –

+0

क्या यह व्यवहार बदलता है यदि एप्लिकेशन वेब फार्म या क्लस्टर पर होस्ट नहीं किया गया है? गैर AJAX अनुरोध काम करते हैं? –

+0

@StephenMuecke: टोकन स्ट्रिंग प्राप्त करने के लिए एक फ़ंक्शन – warheat1990

उत्तर

4

अंत में उत्तर मिला:

मैं बस के रूप में .get(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> 
+0

$ (फॉर्म) .get (0) ने मुझे लाइन को पार करने में भी मदद की। Thanx साथी !!! – Arjmand

3

आप अनुरोध हेडर, नहीं फार्म के लिए टोकन जोड़ने की जरूरत:

मैं जवाब मिल गया। इस तरह:

 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 अनुरोध के लिए भर नहीं प्राप्त करता है में लग रहा है। (आपके मामले में, फ़ाइल अपलोड को multipart/form-data सामग्री प्रकार की आवश्यकता होती है, जबकि सीएसआरएफ टोकन के लिए एक फॉर्म पोस्ट application/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"]); 
    } 
} 

अधिक जानकारी (पुराना हो चुका थोड़ा अब: तो, क्रम सर्वर पर टोकन मान्य करने के लिए में, आप उस अनुरोध हेडर में टोकन के लिए जाँच करता है अपनी कार्रवाई विधि के लिए एक कस्टम विशेषता लिखने के लिए की आवश्यकता होगी) here

+0

टोकन को 'फॉर्मडाटा' में जोड़ा जा सकता है। यदि ओपी का वर्तमान कोड काम नहीं करता है, तो न ही यह होगा। –

+0

अंततः उत्तर मिला, मेरी अद्यतन पोस्ट की जांच करें। – warheat1990