एएसपी.नेट एमवीसी के एंटीफोर्गेरी टोकन तंत्र वर्तमान HttpContext.User
पर आधारित है। जब आप Html.AntiForgeryToken()
पर कॉल करते हैं तो यह टोकन बनाने के लिए उस मान का उपयोग करता है। असल में यह ठीक है (last paragraph here में एक स्पष्टीकरण देखें) लेकिन जब आप अजाक्स कॉल के माध्यम से लॉग इन करते हैं तो समस्या उत्पन्न होती है।एमवीसी 3 एंटीफॉर्गेरी टोकन अजाक्स लॉगिन
मेरे कोड में, जब कोई उपयोगकर्ता में लॉग करता है, साख अजाक्स (AntiForgeryToken
छिपी हुई फ़ील्ड मान भी Json अंदर भेज दिया जाता है), सर्वर, उपयोगकर्ता प्रमाणित करता है FormsAuthentication.SetAuthCookie लागू होता है में एक json वस्तु के रूप में भेजा जाता है() , और एक जेसन परिणाम देता है जिसमें कुछ उपयोगकर्ता-विशिष्ट डेटा होता है। इस तरह, मैं लॉगिन पर पूर्ण पृष्ठ रीफ्रेश से बच सकता हूं।
समस्या यह है कि सर्वर से बाद के हर Ajax अनुरोध अब ValidateAntiForgeryTokenAttribute
पर विफल रहता है, क्योंकि यह अब एक विरोधी जालसाजी टोकन कि विरोधी जालसाजी कुकी के साथ असंगत है उम्मीद है।
क्लाइंट के छिपे हुए क्षेत्र में रखने के लिए मुझे एक वैध एंटी-जालसाजी टोकन कैसे मिल सकता है ताकि लॉगिन के बाद हर जेसन अनुरोध सफल हो जाए?
मैं टोकन मैन्युअल रूप से नया छिपा मैदान प्राप्त करने की कोशिश (कार्रवाई पर AntiForgery.GetHtml()
का उपयोग कर, अपने आप टोकन स्ट्रिंग निकालने, Json में ग्राहक को लौटने और जावास्क्रिप्ट में मैन्युअल रूप से विरोधी जालसाजी छिपी हुई फ़ील्ड में रखने से) लेकिन यह काम नहीं करता है - बाद में अजाक्स कॉल सर्वर पर ValidateAntiForgeryTokenAttribute
पर विफल रहता है। वास्तव में, AntiForgery.GetHtml()
पर प्रत्येक कॉल (जो अनिवार्य रूप से Html.AntiForgeryToken()
सहायक है) एक अलग टोकन उत्पन्न करता है, जो पिछले एक को अमान्य करता है।
मैंने HttpContext.User = new GenericPrincipal(new GenericIdentity(email), null);
को विस्तृत here के रूप में सेट करने का भी प्रयास किया, लेकिन यह काम नहीं करता है।
नोट:This solution मेरी विशिष्ट स्थिति की वजह से, मेरे लिए काम नहीं करता है: एक अजाक्स लॉगिन जो सर्वर और इसलिए हर टोकन से पहले लॉगिन अमान्य है कि जेनरेट हुआ था उपयोगकर्ता पहचान नहीं बदलेगा; this solution भी लागू नहीं होता है क्योंकि यह एक अलग समस्या को संबोधित करता है।
जब आप उपयोगकर्ता को अनधिकृत करते हैं, तो आप अपने लॉगिन पेज पर एंटीफ़ोर्गेरी टोकन का उपयोग क्यों कर रहे हैं। आप क्या रक्षा कर रहे हैं –
लॉगिन सुविधा एक पृष्ठ नहीं है, यह साइट के टेम्पलेट के अंदर एक टुकड़ा है। वास्तव में लॉगिन सुविधा में इसकी आवश्यकता नहीं है, लेकिन बाद में समस्या उत्पन्न होती है - सर्वर पक्ष पर लॉगिन विधि के बाद वर्तमान उपयोगकर्ता (HttpContext.User) सेट करता है और लौटाता है। इस चरण में, अजाक्स कॉल की सेवा के लिए पृष्ठ में पहले से ही कुछ विरोधी जालसाजी टोकन छुपा क्षेत्र होना चाहिए। –
फिल हैक ने कुछ दिन पहले इस लेख को पोस्ट किया था। क्या यह आपकी समस्या से संबंधित है? http://haacked.com/archive/2011/10/10/preventing-csrf-with-ajax.aspx ... "समस्या इस तथ्य में निहित है कि हुड के नीचे, कॉल स्टैक के भीतर गहरी, विशेषता peeks एंटी-फर्जी टोकन को पकड़ने के लिए Request.Form संग्रह में। लेकिन जब आप JSON एन्कोडेड डेटा पोस्ट करते हैं, तो बोलने के लिए कोई फॉर्म संग्रह नहीं होता है। " – JasperLamarCrabb