2010-01-31 14 views
11

मेरे पास एकाधिक सबडोमेन, subone.parent.com, subtwo.parent.com के साथ एक ऐप है।एएसपी.नेट सबडोमेन कुकी (पैरेंट और एक सबडोमेन)

मेरे पास parent.com/login पर एक लॉगऑन पृष्ठ है। जब कोई उपयोगकर्ता लॉग इन करता है तो मैं उन्हें उचित डोमेन पर रीडायरेक्ट करता हूं जिसके आधार पर वे सदस्य होते हैं। यह ठीक काम करता है।

FormsAuthenticationTicket ticket = new FormsAuth... 
string encTicket = FormsAuthentication.Encrypt(ticket); 
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket); 
cookie.Domain = subone.parent.com 
Response.Cookies.Add(cookie) 

यह उपयोगकर्ता को subone.parent.com के लिए उचित रूप से प्रमाणित करता है और subtwo.parent.com नहीं। हालांकि मैं निम्नलिखित करना चाहता हूं।

यदि उपयोगकर्ता parent.com पर वापस जाता है, तो मैं जानना चाहता हूं कि वे लॉग इन हैं और उन्हें वापस subone.parent.com पर रीडायरेक्ट करते हैं।

क्या इसे पूरा करने के लिए कोई सर्वोत्तम अभ्यास है? या क्या मुझे parent.com के लिए एक और कुकी सेट करना है?

यदि यह महत्वपूर्ण है तो मैं एएसपीनेट एमवीसी में काम कर रहा हूं।

धन्यवाद!

उत्तर

5

आप उन डोमेन पर कुकीज साझा कर सकते हैं जैसे आप करने की कोशिश कर रहे हैं, लेकिन यह सीधे आगे नहीं है, उदाहरण here

एक और विकल्प कुकी को उप-डोमेन को स्पष्ट रूप से निर्दिष्ट करने और उप-डोमेन के विवरण को कुकी स्टोर का उपयोग करने के बजाय ".parent.com" होने के लिए सेट करना है। फिर आप अपने किसी भी उप डोमेन से कुकी तक पहुंच सकते हैं (और माता-पिता अपना www.parent.com मानते हैं)।

यदि आप एमवीसी का उपयोग करते हैं, तो आप आसानी से एक कस्टम फ़िल्टर बना सकते हैं और कुकी के अस्तित्व की जांच के लिए www.parent.com नियंत्रकों में जोड़ सकते हैं, और यदि उप डोमेन पर रीडायरेक्ट किया जाता है तो कुकी निर्दिष्ट करती है। फिल्टर here के और विवरण।

+0

मैं अपने दूसरे लगता है यहां विकल्प काम कर सकता है। मैं डोमेन को अभिभावक को सेट कर रहा हूं। मैंने FormsAuthTicket उपयोगकर्ता डेटा में सबडोमेन जोड़ा है। मैंने एक कस्टम इडेंटिटी बनाई है जो कि प्रमाणीकृत पर होगा, उपयोगकर्ता डेटा के खिलाफ वर्तमान डोमेन की जांच करेगा। तुम क्या सोचते हो? – Paul

+0

15seconds लिंक अब ऐसा नहीं लगता है जहां यह माना जाता है .. –

0

मैं आपके पास स्पष्ट डोमेन के लिए कुकी सेट करूँगा क्योंकि यह उस विशिष्ट डोमेन की कुकी के भीतर किसी भी सुरक्षा जानकारी को बनाए रखता है। आप * .parent.com स्तर पर एक गैर-एन्क्रिप्टेड कुकी भी जोड़ सकते हैं जिसमें डोमेन को प्रमाणीकृत किया गया है, इस बारे में जानकारी है। हालांकि इसे टाइमस्टैम्प का उपयोग किए बिना और अनुप्रयोगों के बीच लॉजिकल कनेक्शन होने के बावजूद इसे एक साथ जोड़ने का कोई वास्तविक तरीका नहीं है (यानी - सब 2 में 20 मिनट का सत्र टाइमआउट होता है, इसलिए यदि डोमेन + मान्य टाइमस्टैम्प मूल कुकी में होता है तो यह मान्य होगा, हालांकि यह व्यापार तर्क है)।

मुझे यकीन नहीं है कि डोमेन के बीच डिस्कनेक्ट के पीछे तर्क है, लेकिन आप वास्तव में एक ऐसी कुकी रखना पसंद कर सकते हैं जिसने एन्क्रिप्टेड टेक्स्ट के पीछे टेक्स्ट एन्क्रिप्ट किया हो। ईजी:

1) सब 1 लॉग इन करता है, parent.com कुकी को मान्य के रूप में सेट करता है। उपयोगकर्ता डेटा का एक टुकड़ा प्रमाणीकरण वेब सेवा में भेजता है।

2) प्रमाणीकरण सेवा प्रेषक के रूप में उप 1 को पहचानती है, उपयोगकर्ता डेटा को एन्क्रिप्ट करता है, और इसे कस्टम कुकी ऑब्जेक्ट में जोड़ता है।

3) कस्टम कुकी ऑब्जेक्ट एक अद्वितीय स्प्लिट वर्ण (या अनुक्रम) पर एक समग्र स्ट्रिंग बनाता है और इसे सेवा विधि में उपलब्ध कराता है।

4) फॉर्म एन्क्रिप्शन का उपयोग करते हुए सेवा, पूरे टिकट को एन्क्रिप्ट करता है और इसे मूल लॉगिन पर भेजता है।

इस तरह प्रत्येक सर्वर वैश्विक टिकट को एन्क्रिप्ट नहीं कर पाएगा, लेकिन डेटा के प्रत्येक टुकड़े को एक सामान्य एल्गोरिदम का उपयोग करके एन्क्रिप्ट किया जाएगा लेकिन सर्वर आधारित नमक होगा। तो अगर उप 2 से कुकी डेटा को पढ़ने का प्रयास करता है, तो यह कच्चे डेटा की बजाय एन्क्रिप्टेड संस्करण प्राप्त करता है।

+0

धन्यवाद, अगर मैं .parent स्तर पर एक अनएन्क्रिप्टेड उपयोगकर्ता कुकी जोड़ता हूं तो उसे अन्य सबडोमेन तक पहुंच की अनुमति देने के लिए बदला/स्पूफ नहीं किया जा सकता है? – Paul

+0

@ पॉल: क्रमबद्ध करें। मैं एन्क्रिप्शन के 2 स्तरों का सुझाव दे रहा हूं। पहला डिफ़ॉल्ट फॉर्म प्रमाणीकरण एन्क्रिप्शन है जो आपकी पूरी कुकी को केवल * .parent.com डोमेन पर निजी रखता है। दूसरा कुकी का प्रत्येक निजी भाग पर लागू एक आंतरिक एन्क्रिप्शन है जिसका नमक केवल मास्टर सर्वर और व्यक्तिगत सर्वर के बीच जाना जाता है। प्रत्येक सबडोमेन को पूरी कुकी तक पहुंच होगी, लेकिन वे एक अलग सबडोमेन से संबंधित अनुभाग को डिक्रिप्ट करने में असमर्थ होंगे। प्रपत्र प्रमाणीकरण। प्रमाणीकृत के परिणामस्वरूप "सत्य" मान होगा। –

+0

@ पॉल: जारी - यह ध्यान में रखते हुए, आपको इस चेक को उस चीज़ के साथ बढ़ाने की आवश्यकता होगी जो वास्तविक कुकी में डेटा को मान्य करता है। IsAuthenticated && MyCookieData.IsValid (टिकट) या ऐसा कुछ है। –

0

आप सभी सबडोमेन पर एक ही सत्र साझा कर सकते हैं। यही कारण है कि कोड हम पूरा करने के लिए है कि :-)

void MasterPage_Unload(object sender, EventArgs e) 
{ 
    ///ASP.NET uses one cookie per subdomain/domain, 
    ///we need one cookie for _all_ subdomains. 
    if (Context.Response.Cookies["ASP.NET_SessionId"] == null) 
     return; 

    var sessionCookie = new HttpCookie("ASP.NET_SessionId", Context.Session.SessionID); 
    sessionCookie.Domain = ".yourdomain.com" ; 
    Context.Response.SetCookie(sessionCookie); 
} 

Page_Load विधि के अंदर का उपयोग है:

Unload += MasterPage_Unload; 

यह काम करता है महान :-)

रॉबर्ट

+0

धन्यवाद रॉबर्ट, लेकिन मैं नहीं चाहता कि उपयोगकर्ता सभी सबडोमेन, केवल एक और रूट पर प्रमाणीकृत हो। – Paul

+0

हमें इस समाधान के साथ एक गंभीर समस्या का सामना करना पड़ा: इसने कोड के साथ मास्टरपेज का उपयोग करने वाले सभी पृष्ठों पर काम करने से 'आउटपुट कैश' रखा। [यहां यह समाधान] (http://stackoverflow.com/a/2088853/177710) आउटपुट कैश को एक आकर्षक की तरह काम करता है। – Oliver

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