asp.net - एक WCF सेवा के लिए प्रपत्र प्रमाणीकरण कुकी पासिंग




forms-authentication wcf-security (2)

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

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

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

कोई विचार?


अगर आप प्रमाणित IIS साइट के भीतर WCF सेवा की मेजबानी करते हैं तो यह करना बहुत आसान है।

अपने सिस्टम में निम्नलिखित को जोड़कर संगतता को सक्षम करें। अपने web.config में सेवामॉडेल अनुभाग

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

फिर प्रत्येक सेवा जिसे आप कुकी को निम्न के साथ स्वीकार करना चाहते हैं को सजाने के लिए

[AspNetCompatibilityRequirements(
    RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

अब HttpContext.Current.User.Identity ऑब्जेक्ट सही ढंग से पॉपुलेटेड हो जाएगा और आप PrinciplePermission की भूमिका का उपयोग करके भूमिका या विशेष उपयोगकर्ताओं के लिए सीमा को सीमित कर सकते हैं।


ऐसा लगता है जैसे आप Windows संचार फाउंडेशन प्रमाणीकरण सेवा की तलाश कर रहे हैं।

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

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

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

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

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

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

<forms ... domain=".foo.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 अनुरोध को एएसपी.नेट प्रसंस्करण पाइपलाइन के माध्यम से सेट कर सकते हैं।

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

अगर आप स्वयं की मेजबानी कर रहे हैं तो आप ऑपरेशनकॉन्टेक्स्ट में आने वाले संदेश के गुणों का उपयोग करते हुए अनुरोध शीर्षलेखों की जांच कर सकते हैं। वर्तमान। FormsAuthentication.Decrypt(string) और फॉर्म प्रमाणन कुकी मान प्राप्त करें और FormsAuthentication.Decrypt(string) का उपयोग करके इसे डिक्रिप्ट करें।

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







wcf-security