2010-02-28 13 views
8

का उपयोग कर AJAX अनुरोधों में सीएसआरएफ संरक्षण, जो पृष्ठ मैं बना रहा हूं वह AJAX पर भारी निर्भर करता है। असल में, केवल एक "पृष्ठ" है और प्रत्येक डेटा स्थानांतरण AJAX के माध्यम से संभाला जाता है। चूंकि ब्राउजर साइड पर अतिव्यापी कैशिंग अजीब समस्याएं उत्पन्न करती है (डेटा पुनः लोड नहीं किया जाता है), मुझे POST का उपयोग करके सभी अनुरोध (पढ़ा जाता है) करना होता है - जो एक रीलोड को मजबूर करता है।एमवीसी 2

अब मैं सीएसआरएफ के खिलाफ पृष्ठ को रोकना चाहता हूं। फॉर्म सबमिशन के साथ, Html.AntiForgeryToken() का उपयोग अच्छी तरह से काम करता है, लेकिन AJAX- अनुरोध में, मुझे लगता है कि मुझे टोकन मैन्युअल रूप से जोड़ना होगा? क्या बॉक्स के बाहर कुछ भी उपलब्ध है?

मेरे वर्तमान प्रयास यह की तरह दिखता है:

मैं मौजूदा जादू पुन: उपयोग करने में खुशी होगी। हालांकि, HtmlHelper.GetAntiForgeryTokenAndSetCookie निजी है और मैं एमवीसी में चारों ओर हैक करना नहीं चाहता हूं। कि टोकन को सत्यापित करने के लिए: अन्य विकल्प की तरह

public static string PlainAntiForgeryToken(this HtmlHelper helper) 
{ 
    // extract the actual field value from the hidden input 
    return helper.AntiForgeryToken().DoSomeHackyStringActions(); 
} 

जो कुछ हद तक hacky है और अनसुलझी बड़ा समस्या छोड़ देता है एक विस्तार लिखने के लिए है? डिफ़ॉल्ट सत्यापन कार्यान्वयन फॉर्म फ़ील्ड का उपयोग करने के खिलाफ आंतरिक और हार्ड-कोडित है। मैंने थोड़ा संशोधित ValidateAntiForgeryTokenAttribute लिखने की कोशिश की, लेकिन यह AntiForgeryDataSerializer का उपयोग करता है जो निजी है और मैं वास्तव में इसे कॉपी नहीं करना चाहता था।

इस बिंदु पर घर के समाधान के साथ आने में आसान लगता है, लेकिन यह वास्तव में डुप्लिकेट कोड है।

कोई सुझाव यह स्मार्ट तरीका कैसे करें? क्या मैं कुछ पूरी तरह से याद कर रहा हूँ?

उत्तर

10

आप (एक फार्म के अंदर जरूरी नहीं) पारंपरिक Html.AntiForgeryToken() सहायक का उपयोग पृष्ठ पर कहीं एक छिपी हुई फ़ील्ड उत्पन्न करने के लिए सकता है और यह ajax अनुरोध के साथ शामिल हैं:

var token = $('input[name=__RequestVerificationToken]').val(); 
$.post(
    '/SomeAction', { '__RequestVerificationToken': token }, 
    function() { 
     alert('Account Deleted.'); 
    } 
); 

सर्वर साइड पर यह सत्यापित करने के लिए:

[AcceptVerbs(HttpVerbs.Post)] 
[ValidateAntiForgeryToken] 
public ActionResult SomeAction() 
{ 
    return View(); 
} 

यदि आपके पृष्ठ पर एकाधिक टोकन हैं तो आपको यह निर्दिष्ट करने की आवश्यकता हो सकती है कि कौन सा शामिल करना है। मौजूदा सहायक एक ही नाम के साथ छिपा क्षेत्रों उत्पन्न करता है के रूप में यह एक अच्छा चयनकर्ता बनाने के लिए मुश्किल है ताकि आप उन्हें अंदर फैला बन सकता था:

<span id="t1"><%= Html.AntiForgeryToken() %></span> 
<span id="t2"><%= Html.AntiForgeryToken() %></span> 

और फिर इसी टोकन का चयन करें:

var token = $('#t1 input[name=__RequestVerificationToken]').val(); 
+0

शानदार! एक जादू की तरह काम करता है! मुझे नहीं पता कि पोस्ट किए गए फ़ील्ड 'Request.Form' में समाप्त हो जाएंगे। बहुत साफ चयन कथन के लिए +1। चीयर्स! – mnemosyn

संबंधित मुद्दे