2009-07-06 18 views
11

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

serviceClient.ClientCredentials.UserName.UserName = username; 
serviceClient.ClientCredentials.UserName.Password = password; 

लेकिन क्या मैं वास्तव में चाहते हैं, सीधे FormsAuthentication कुकी पारित करने के लिए है क्योंकि मैं डॉन है उपयोगकर्ता पासवर्ड स्टोर नहीं करना चाहता।

कोई भी विचार?

+0

हैलो एरियल, आप इस के साथ कैसे पहुंचे? मैं इसी तरह के मुद्दों वाले किसी को जानता हूं। –

उत्तर

13

ऐसा लगता है कि आप Windows Communication Foundation Authentication Service देख रहे हैं।

संपादित करें:

प्रश्न अधिक ध्यान से फिर से पढ़ने (और एरियल की टिप्पणी के बाद) के बाद मैं ऊपर सुझाव वापस लेना चाहते हैं। डब्ल्यूसीएफ प्रमाणीकरण सेवा इस परिदृश्य में ज्यादा नहीं जोड़ पाएगी।

मैं WCF और ASP.NET के बीच ऐसा नहीं किया है, हालांकि मैं उपयोगकर्ताओं को प्रमाणीकृत रूपों साझा करने के लिए ASP.NET अनुप्रयोगों कॉन्फ़िगर किया है, शायद मैं किसी तरह से कर सकते हैं।

सुनिश्चित करना है कि दोनों आवेदनों एन्क्रिप्ट कर सकते हैं/उसी तरह आपको दोनों ऐप्लिकेशन (web.config या machine.config में के लिए configure the <machineKey> element आप मशीन या आवेदन के स्तर पर ऐसा करना चाहते हैं, इस आधार पर करना चाहिए में रूपों प्रमाणीकरण कुकी को डिक्रिप्ट करने के लिए)। आपको validation, validationKey, decryption और decryptionKey विशेषताओं को देखना चाहिए।

सुनिश्चित करें कि दोनों web.config फ़ाइलों में अपने <forms> तत्वों समान रूप से कॉन्फ़िगर कर रहे हैं। विशेष रूप से name, path और domain विशेषताएँ।

यह संभव है कि यह केवल एक वेब ब्राउज़र से करने के लिए/पारित कर दिया कुकीज़ पर लागू होता है (लेकिन इस मामले में उपयोगी हो सकता है): कुकीज़ वेबसाइटों के बीच पारित करने की अनुमति के लिए www.foo.com और bar.foo .com आप forms तत्व कॉन्फ़िगर के रूप में कुकीज़ दूसरे से एक साइट पर स्थापित किया जाना है और सफलतापूर्वक पारित कर दिया अनुमति देने के लिए इस प्रकार है:

<forms ... domain=".foo.com" ... /> 

WCF सेवा करने के लिए कुकी पासिंग मुश्किल सा होने की संभावना है। मैं बहुत WCF के साथ अनुभव नहीं कर रहा हूँ, इसलिए I've adapted code from kennyw.com:

HttpRequestMessageProperty httpRequestProperty = new HttpRequestMessageProperty(); 
httpRequestProperty.Headers.Add(HttpRequestHeader.Cookie, "<Forms Authentication Cookie>"); 

using (OperationContextScope scope = new OperationContextScope(serviceClient.InnerChannel)) 
{ 
    OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = httpRequestProperty; 
    serviceClient.MethodName(); 
} 

आप आईआईएस (और नहीं स्वयं की मेजबानी) के भीतर WCF होस्ट कर रहे हैं, तो आप

की स्थापना करके ASP.NET प्रसंस्करण पाइप लाइन के माध्यम WCF अनुरोध पारित कर सकते हैं
<system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" ... /> 
</system.serviceModel> 

आप स्वयं की मेजबानी आप OperationContext.Current.IncomingMessageProperties में भेजे संदेश के गुण का उपयोग कर अनुरोध हेडर की जांच करने और रूपों प्रमाणीकरण कुकी मूल्य मिलता है और FormsAuthentication.Decrypt(string) का उपयोग कर इसे डिक्रिप्ट कर सकता है कर रहे हैं।

मुझे नहीं पता कि इनमें से कोई भी काम करेगा या नहीं, लेकिन यह सुनना अच्छा लगेगा कि यह करता है!

+0

मुझे नहीं पता कि प्रमाणीकरण सेवा कैसे मदद कर सकती है। मेरा परिदृश्य यह है: उपयोगकर्ता -> वेब साइट ए -> डब्ल्यूसीएफ सेवा बी अन्यत्र होस्ट किया गया उपयोगकर्ता ए में प्रवेश करता है, ए उपयोगकर्ता प्रमाण-पत्रों का उपयोग करके बी को कॉल करता है। आप प्रमाणीकरण सेवा कहां जोड़ देंगे? –

+0

हाय एरियल। क्षमा करें मैंने वास्तव में आपके प्रश्न को पढ़ने के बिना बहुत जल्दी जवाब देने का प्रयास किया। मैं इसे एक अद्यतन के साथ संपादित कर दूंगा। – dariom

+0

सुझाव के लिए धन्यवाद, मैं कोशिश करूँगा और यहां परिणामों को साझा करूंगा। –

4

यदि आप प्रमाणीकृत आईआईएस साइट के भीतर डब्ल्यूसीएफ सेवा होस्ट करते हैं तो यह करना काफी आसान है।

<system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 
</system.serviceModel> 

फिर प्रत्येक सेवा आप अब निम्न

[AspNetCompatibilityRequirements(
    RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 

साथ कुकी स्वीकार करने की इच्छा को सजाने अपने web.config में अपने system.ServiceModel अनुभाग के लिए निम्न जोड़कर संगतता सक्षम करें HttpContext.Current.User.Identity ऑब्जेक्ट सही ढंग से पॉप्युलेट किया जाएगा और आप भूमिका या विशेष उपयोगकर्ताओं द्वारा पहुंच को सीमित करने के लिए प्रिंसिपलमिशन की मांगों का भी उपयोग कर सकते हैं।

+0

ठीक है, यह समस्या है, मैं एक ही आईआईएस का उपयोग नहीं कर सकता। मैं जिस प्रणाली का निर्माण कर रहा हूं उसके लिए एक आवश्यकता अलग-अलग मशीनों में वेब साइट और सेवा की मेजबानी करना था। मैं एक साझा टोकन का उपयोग करने पर विचार कर रहा हूं लेकिन मैं फॉर्म का उपयोग कर एएसपीनेट से आने के लिए सबसे आसान समाधान था। –

+0

आह सोड! क्या आप उन्हें कम से कम उसी डोमेन नाम पर डाल सकते हैं? यदि ऐसा है तो आप फॉर्म ऑथ कुकी स्कोप सेट कर सकते हैं और इसे इस तरह साझा कर सकते हैं। – blowdart

+0

मुझे ऐसा लगता है, एप्लिकेशन एक रूट डोमेन के तहत एक इंट्रानेट में होस्ट किया जाएगा। हम समान मशीन कुंजियां भी सेट कर सकते हैं लेकिन ध्यान रखें कि उपयोगकर्ता वेबसाइट तक पहुंच रहा है और वेबसाइट डब्ल्यूसीएफ का उपयोग उपयोगकर्ता के प्रतिरूपण डेटा स्रोत के रूप में करती है। यह विंडोज प्रमाणीकरण के साथ ठीक काम करता है लेकिन फॉर्म प्रमाणीकरण कुकी पास करना एक अलग कहानी है। मैं डेरियम सुझाव (या उपलब्ध होने पर कोई अन्य) कोशिश करूंगा। –

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