2011-08-22 6 views
8

यहां इस एसओ उत्तर में एएसपी.नेट फॉर्म प्रमाणीकरण की एक दिलचस्प विशेषता है: How do you pass an authenticated session between app domainsEnableCrossAppRedirects - क्रॉस-डोमेन सुविधा कहां से प्रलेखित है?

त्वरित सारांश; आप एक ही एन्क्रिप्शन कुंजी के साथ दो एएसपी.NET वेबसाइटें बना सकते हैं। WebsiteA एक फॉर्मूथ टोकन बना सकता है, और querystring (या POST body) में टोकन के साथ वेबसाइटबी पर रीडायरेक्ट कर सकता है। WebsiteB और ASP.NET में EnableCrossAppRedirects पर स्विच टोकन का पता लगाता है और फॉर्मूथ कुकी बनाता है। कोड में:

FormsAuthentication.RedirectFromLoginPage("alice", true); 
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket("Alice", true, 30); 
string encrypted = FormsAuthentication.Encrypt(ticket); 
Response.Redirect("http://siteb.dev/Secure/WebForm1.aspx?" + FormsAuthentication.FormsCookieName + "=" + encrypted); 

एक महान सुविधा की तरह लगता है, लेकिन जहां यह दर्ज है? मुझे एक अनियंत्रित सुविधा का उपयोग करके बिट असहज महसूस होगा।

जहां मैंने देखा है - किसी भी एमएसडीएन संदर्भ में इस सुविधा का कोई उल्लेख नहीं है। मैंने सोचा कि शायद RedirectFromLoginPage उपरोक्त मेरे कोड की तरह एक रीडायरेक्ट का निर्माण करेगा, ऐसा नहीं है।

  • EnableCrossAppRedirects - "RedirectFromLoginPage विधि के भीतर जब रीडायरेक्ट URL वर्तमान आवेदन में एक पृष्ठ पर बात नहीं करता है की जाँच की है, तो EnableCrossAppRedirects सत्य है, तभी रीडायरेक्ट किया जाता है।"
  • Forms Authentication Across Applications - स्थापित करने पर कुछ सलाह मशीन चाबियाँ ताकि बारे में EnableCrossAppRedirects
  • forms Element for authentication

उत्तर

14

एक कुकी एक सब-डोमेन पर बनाई गई है, कुछ भी परावर्तक को देखा करने के बाद वहाँ एक (कुछ गैर-दस्तावेजी) रूपों में से विशेषता है प्रमाणीकरण। जब EnableCrossAppRedirects सक्षम है .NET कुकी, ऑथ कुकी की तलाश के अलावा, प्रपत्र प्रमाणीकरण "कुकी" को फॉर्म पोस्ट या क्वेरी स्ट्रिंग से निकालने का प्रयास करेगा। यह कोड FormsAuthentication कक्षा में ExtractTicketFromCookie विधि में एम्बेड किया गया है, जहां यह अनुरोध डेटा में प्रमाणीकरण कुकी खोजने की कोशिश कर रहा है।

if (FormsAuthentication.EnableCrossAppRedirects) 
{ 
    text = context.Request.QueryString[name]; 
    if (text != null && text.Length > 1) 
    { 
     if (!cookielessTicket && FormsAuthentication.CookieMode == HttpCookieMode.AutoDetect) 
     { 
      cookielessTicket = CookielessHelperClass.UseCookieless(context, true, FormsAuthentication.CookieMode); 
     } 
     try 
     { 
      formsAuthenticationTicket = FormsAuthentication.Decrypt(text); 
     } 
     catch 
     { 
      flag2 = true; 
     } 
     if (formsAuthenticationTicket == null) 
     { 
      flag2 = true; 
     } 
    } 
    if (formsAuthenticationTicket == null || formsAuthenticationTicket.Expired) 
    { 
     text = context.Request.Form[name]; 
     if (text != null && text.Length > 1) 
     { 
      if (!cookielessTicket && FormsAuthentication.CookieMode == HttpCookieMode.AutoDetect) 
      { 
       cookielessTicket = CookielessHelperClass.UseCookieless(context, true, FormsAuthentication.CookieMode); 
      } 
      try 
      { 
       formsAuthenticationTicket = FormsAuthentication.Decrypt(text); 
      } 
      catch 
      { 
       flag2 = true; 
      } 
      if (formsAuthenticationTicket == null) 
      { 
       flag2 = true; 
      } 
     } 
    } 
} 

इसलिए अगर आपको दोनों ऐप्लिकेशन पर EnableCrossAppRedirects सक्षम करते हैं तो पहले आवेदन बाहरी साइट पर रीडायरेक्ट करने के लिए अधिकृत किया गया है, और दूसरा आवेदन स्वचालित रूप से अनुरोध से प्रमाणीकरण कुकी में पढ़ा जाएगा। आपको बस इसे इंजीनियर करने की आवश्यकता है ताकि वापसी लॉगिन यूआरएल या तो कुकी डेटा पोस्ट कर सके या क्वेरीस्ट्रिंग में भेज सके। आपको यह सुनिश्चित करने की भी आवश्यकता है कि या तो मशीन कुंजियां सिंक्रनाइज़ हों, या कुकी को बाहरी ऐप्स मशीन कुंजी (पहले ऐप द्वारा) का उपयोग करके एन्क्रिप्ट किया गया हो। यह डिफ़ॉल्ट रूप से लगता है .NET आपके लिए क्वेरीस्ट्रिंग में एन्क्रिप्टेड प्रमाणीकरण कुकी भेज देगा और आपके मशीन कुंजियां सिंक हो जाएंगी (नीचे एमएसडीएन उद्धरण देखें)।

यहां कुछ और info on MSDN है।

तो CookiesSupported संपत्ति सच है, और या तो ReturnUrl चर वर्तमान आवेदन के भीतर है या EnableCrossAppRedirects संपत्ति सत्य है, तभी RedirectFromLoginPage विधि एक प्रमाणीकरण टिकट और यह डिफ़ॉल्ट कुकी में स्थानों का उपयोग करते हुए जारी करता है SetAuthCookie विधि।

यदि कुकीज़ समर्थित है तो गलत है और रीडायरेक्ट पथ वर्तमान एप्लिकेशन में एक यूआरएल के लिए है, तो टिकट रीडायरेक्ट यूआरएल के हिस्से के रूप में जारी किया जाता है। तो CookiesSupported गलत है, EnableCrossAppRedirects सच है, और रीडायरेक्ट URL वर्तमान आवेदन के भीतर एक पृष्ठ का उल्लेख नहीं करता, RedirectFromLoginPage विधि एक प्रमाणीकरण टिकट और यह स्थानों QueryString संपत्ति में जारी करता है।

सुरक्षा पर असर के बारे में एक बड़ी चेतावनी है। EnableCrossAppRedirects एक सुरक्षा सेटिंग है जो ASP.NET लॉगिन नियंत्रण को बाहरी रिटर्न URL (अन्य वेब एप्लिकेशन) पर रीडायरेक्ट करने से रोकती है। इस सेटिंग के साथ इसे आक्रमण के कुछ रूपों में शोषित किया जा सकता है - उपयोगकर्ता को आधिकारिक लॉगिन पेज पर भेजा जाता है, लेकिन लॉगिन पर एक अलग एप्लिकेशन पर रीडायरेक्ट किया जाता है जिसे वे मान सकते हैं। यही कारण है कि यह डिफ़ॉल्ट रूप से अक्षम है।

एक मदद करने के लिए इस को कम जब सुविधा को सक्षम करने इस प्रकार है जिस तरह से:

का उपयोग करते समय पार आवेदन पुनर्निर्देश सुरक्षा को बेहतर बनाने के लिए, आप रीडायरेक्ट केवल करने के लिए मंजूरी दे दी वेब साइटों अनुमति देने के लिए RedirectFromLoginPage विधि ओवरराइड करना चाहिए ।

आपको यह भी सुनिश्चित करने के लिए पुन: निर्देशन अनुरोध "कुकी" पारगमन में की रक्षा के लिए SSL पर पेश किया जाता है, के रूप में किसी को भी बाधा उत्पन्न कर रहा खाते का नियंत्रण हासिल करने में सक्षम हो जाएगा की जरूरत है।

+0

क्षमा करें मेरे उत्तर में संशोधन किया गया है, .NET की एक छिपी हुई विशेषता है जो स्वचालित रूप से प्रमाणीकरण कुकी को फ़ॉर्म फॉर्म या क्वेरी स्ट्रिंग के रूप में उठाएगी। मैंने अभी कुछ नया सीखा है! – TheCodeKing

+0

महान जवाब! तो मैं 'नो कुकीज़' ऑथ की सुविधा को कम करने का तरीका हूं। सुरक्षा खतरे: मैं RedirectFromLoginPage का उपयोग नहीं कर रहा हूं, इसलिए मैं नियंत्रित करता हूं कि उपयोगकर्ता को रीडायरेक्ट किया जाता है। एसएसएल पर रीडायरेक्ट - पोस्ट/क्वेरीस्ट्रिंग पर टोकन फॉर्मूथ कुकी से कम सुरक्षित नहीं है, सुरक्षित शर्त पूरी वेबसाइट को एसएसएल पर रखना है। – russau

+0

बीटीडब्ल्यू - क्यों समुदाय विकी? जब भी मैं इसे पुरस्कार दूंगा तब भी आपको बक्षीस मिलेगा? – russau

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