2012-10-01 13 views
11

समाप्त हो रही एक वेब पेज में हम एक हाइपरलिंक (GET) उपयोगकर्ता को प्रमाणित करने के पर क्लिक कर सकते है कि प्रदान करते हैं:ASP.NET MVC - ValidateAntiForgeryToken

@Html.ActionLink("Please Login", "MyMethod", "MyController") 

यह निम्न नियंत्रक विधि है जो एक दृश्य रिटर्न का मानचित्रण:

[RequireHttps] 
    public ActionResult MyMethod() 
    { 
     return this.View(new MyModel()); 
    } 

इस दृश्य में वह फॉर्म शामिल है जिसमें उपयोगकर्ता अपने प्रमाण-पत्र प्रदान करता है; फॉर्म में आवश्यक एंटीफोर्गेरी टोकन शामिल है।

उपयोगकर्ता प्रपत्र सबमिट करते हैं, तो निम्न नियंत्रक विधि कहा जाता है:

[HttpPost] 
    [RequireHttps] 
    [ValidateAntiForgeryToken] 
    public ActionResult MyMethod(MyModel model) 
    { 
     // my logic 
    } 

यह पूरी तरह से अच्छी तरह से काम करता है, समय की सबसे ...

हालांकि, अगर उपयोगकर्ता अपने ब्राउज़र खुला छोड़ देता है प्रपत्र +०१२३५१६४१० में लॉग-लोड करने के लिए

  1. क्लिक्स हाइपरलिंक (जीईटी) पर: समय की एक "महत्वपूर्ण" अवधि के लिए और उसके बाद जल्दी जल्दी में निम्न चरणों प्रदर्शन
  2. प्रपत्र पूर्ण करता है और प्रस्तुत

वे उन्हें सूचित किया कि विरोधी जालसाजी टोकन था या या तो प्रदान नहीं की अवैध था एक अपवाद मिलता है।

मुझे समझ में नहीं आता कि यह क्यों मामला है: ब्राउजर निष्क्रिय होने के बाद व्यू (फॉर्म युक्त) बनाया गया है और इसलिए विरोधी जालसाजी टोकन सभी को "ताजा" होना चाहिए। हालांकि, इस डिजाइन के साथ कुछ स्पष्ट रूप से गलत है, लेकिन मुझे यकीन नहीं है कि इसे कैसे सुधारना है।

यदि आपके पास कोई सुझाव है तो अग्रिम धन्यवाद।

Griff

+0

विरोधी जालसाजी मैं सिर्फ है कि मेरे ऐप कुछ वर्षों के लिए इस समस्या का अनुभव किया है उल्लेख करना चाहते हैं पर समाप्ति बढ़ाएँ और मैं एक समाधान है अच्छा लगेगा। मैंने सभी मानक मशीन कुंजी फिक्सेस की कोशिश की। – Jonathan

+0

स्रोत में उन आस्तीन और गोता लगाने के लिए रोल। मैं पंप आदमी हूँ। – Nick

+0

एक [आलेख] है (http://stackoverflow.com/questions/5767768/troubleshooting-anti-forgery-token-problems?rq=1) जो टोकन के लिए सत्यापन चरणों का विवरण देता है। एक चरण संदर्भ के उपयोगकर्ता के खिलाफ मान्य करना है - यह सुनिश्चित नहीं है कि वह शायद चरण से बाहर हो गया हो। किसी भी तरह से, समाधान अस्पष्ट बनी हुई है। – DrGriff

उत्तर

9

मैं इस एक ही समस्या से निपटने रहा हूँ और जब मैं मुद्दे को समझने, मुझे यकीन है कि अभी तक सबसे अच्छा संकल्प के नहीं हूँ।

एंटी-फोर्जरी टोकन प्रक्रिया कुकी में Requester प्रमाणीकरण टोकन में संग्रहीत दूसरे मान के साथ फ़ॉर्म में इनपुट मान रखती है। इन दोनों को सर्वर पर सबमिट किया गया है और यदि वे मेल नहीं खाते हैं तो त्रुटि फेंक दी जाती है।

RequestVerficationToken कुकी के पास सत्र होने के लिए एक समाप्ति मान सेट है। तो जब उपयोगकर्ता लंबे समय तक पृष्ठ पर ब्राउज़र को खोलता है और फिर सबमिट करता है, तो कुकी के टाइम स्टैम्प की तुलना सर्वर पर सत्र टाइमआउट मान से की जाती है - 20 मिनट या उससे अधिक का डिफ़ॉल्ट - और इसे पार कर दिया जाता है, इसे हटा दिया जाता है और इस प्रकार टोकन सत्यापन विफल रहता है।

संभावित समाधान, जिनमें से सभी संभावित समस्याएं हैं;

  1. पृष्ठ पर एक जावास्क्रिप्ट टाइमर रखें और कुछ सत्र कम पर अपने सत्र समय समाप्ति से रीफ्रेश करें।
  2. सर्वर पर सिस्टम.Web.Mvc.HttpAntiForgeryException को पकड़ें - और उसी पृष्ठ पर को रीडायरेक्ट करें।
  3. अपने सत्र टाइमआउट
  4. बदलें टोकन
+1

नोट, जैसा कि मैं इसे समझता हूं, मशीन कुंजी का उपयोग सर्वर पर एंटी-फोर्जरी टोकन को सत्यापित करने के लिए किया जाता है और वेबफर्म में उपयोग के लिए आवश्यक है (और एक स्थिर मशीन कुंजी सेट करने से कार्यकर्ता प्रक्रिया को पुनरारंभ करने के कारण त्रुटि स्थिति हल हो सकती है सर्वर पर), हालांकि यह कुकी समाप्ति मुद्दे को हल नहीं करेगा। –

+0

जैसा कि आपने कहा था कि कुकी की समाप्ति सत्र से जुड़ी हुई है, इसलिए समाधान 3 को समाधान 4 में भी परिणाम देना चाहिए। जब ​​तक आप मैन्युअल रूप से ओवरराइड नहीं करते हैं कि कुकी कैसे उत्पन्न होती है। मैंने अतीत में समाधान 1 का प्रयास किया है और यह हमेशा पूरी तरह विश्वसनीय नहीं है इसलिए 3 (यदि संभव हो) का संयोजन और 2 सर्वोत्तम विकल्पों की तरह लगते हैं। – Rowan