WCF

2012-03-10 56 views
5

को HttpContext.Current.User.Identity पास करना थोड़ा सलाह (या शायद प्रत्यक्ष जवाब भी) ढूंढ रहे हैं।WCF

मैं एक MVC3 वेबसाइट है। मेरे पास डब्ल्यूसीएफ सेवाओं का एक सेट भी है (अब सबकुछ एक ही बॉक्स पर है)।

क्या मैं ग्राहक को प्रमाणित करना कोशिश कर (वह हिस्सा ठीक काम कर रहा है) कर रहा हूँ, तो पास उस पर उपयोगकर्ता प्रमाणीकृत विभिन्न WCF करने के लिए कहता है।

पल मैं Global.Asax में Application_AuthenticateRequest() विधि को झुका दिया है, जो एक नया GenericIdentity & GenericPrincipal बनाने, तो HttpContext.Current.User करने के लिए कि प्रिंसिपल बताए करने पर निर्भर करता पर:

... 
GenericIdentity identity = new GenericIdentity(userName); 
GenericPrincipal principal = new GenericPrincipal(identity, null); 
HttpContext.Current.User = principal; 
... 

और वह भाग रहा है के रूप में ठीक से काम कर रहा कुंआ।

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

एक मुख्य बात मैंने देखा है कि ग्राहक पक्ष पर, HttpContext.Current.User.Identity ऑब्जेक्ट {System.Web.Security.FormsIdentity} प्रकार है, लेकिन सेवा में यह {System.Security.Principal.WindowsIdentity} है।

मैंने जो कुछ पढ़ा है उसके आधार पर, यह बस मेरे web.config को संशोधित करने जैसा लगता है, इसलिए इसमें aspNetCompatibilityEnabled="true" यह कार्य ठीक से करने के लिए पर्याप्त हो सकता है। लेकिन यह वह नहीं है जो मैं देख रहा हूं। तो या तो मैं सबकुछ समझ नहीं रहा हूं (एक बहुत अच्छी संभावना है) या मुझे कुछ खराब हो गया है (एक और अच्छी संभावना है)।

तो मेरे सवाल का। क्या यह भी संभव है, और यदि ऐसा है - मुझे क्या याद आ रहा है पर विचार? मैंने देखा कि कुछ अन्य ने कुछ ऐसा पोस्ट किया है लेकिन कभी भी एक निश्चित उत्तर प्राप्त नहीं हुआ है (here और here देखें)।

कोई सुझाव बहुत सराहना कर रहे हैं।

+0

यह अजीब है कि आप कहते हैं कि तुम एक 'FormsIdentity' देखते हैं जब आप विशेष रूप से वर्तमान उपयोगकर्ता प्रसंग पर एक' GenericIdentity' की स्थापना कर रहे हैं। क्या तुमने वहां मिश्रण किया? –

उत्तर

2

मैं वास्तव में सीधे आपके प्रश्न का उत्तर नहीं दे सकता लेकिन उम्मीद है कि आपको निश्चित उत्तर खोजने में मदद मिलेगी।

आपके पास 2 सेवा परतें हैं, और ऐसा लगता है कि आपकी आवश्यकता सभी परतों के बीच प्रमाणीकरण पहचान साझा करना है।

तो, सिद्धांत रूप में, आपको इसे प्राप्त करने के लिए एक ही प्रमाणीकरण तंत्र या एल्गोरिदम या तकनीकों की आवश्यकता होगी (कम से कम)। लेकिन इस बिंदु पर आप एक ही उपयोग कर रहे हैं नहीं है (और क्या आपने देखा है जब आप एक FormsIdentity और एक WindowsIdentity वहाँ देखा था)।

तथ्य:

  • आप एक ही प्रमाणीकरण तंत्र की आवश्यकता होगी।
  • जो भी तंत्र आप उपयोग करते हैं, उसे उस तीसरे हॉप का समर्थन करने की आवश्यकता है जिसे आप बनाना चाहते हैं (जिसका अर्थ है कि आप किसी तीसरे सेवा के साथ उपयोगकर्ता की पहचान का उपयोग कर सकते हैं, वास्तव में प्रमाण-पत्र के लिए प्रमाण-पत्र होने के बिना)।

समस्याएं:

  • आप प्रपत्र प्रमाणीकरण का उपयोग करने के लिए जारी है, तो आप (और निश्चित रूप से पहचान क्रेडेंशियल्स प्रदान करते हैं thisमई मदद) अपने WCF सेवा के साथ reauthenticate करने की आवश्यकता होगी।यह तब तक करना मुश्किल लगता है जब तक कि आप उस उपयोगकर्ता को पासवर्ड न रखें जो उपयोगकर्ता को प्रमाणित करने के लिए उपयोग किया जाता है जो आम तौर पर एक बुरा विचार है।
  • यदि आप अपनी साइट के लिए विंडोज प्रमाणीकरण का उपयोग करना जारी रखते हैं, तो उपयोगकर्ता इंट्रानेट से लॉग इन कर रहा है तो आपको एक समस्या होगी। केर्बेरोस के साथ मजेदार चीज (सक्रिय निर्देशिका Kerberos का उपयोग करती है) यह है कि यह उपयोगकर्ता को बिना किसी प्रमाणीकरण के दूरस्थ संसाधनों तक पहुंचने देता है ... लेकिन यह उपयोगकर्ता पहचान टोकन केवल 1 हॉप के लिए अच्छा है। जबकि आपकी डब्ल्यूसीएफ और एमवीसी सेवाएं एक ही सर्वर पर हैं, यह काम करेगी लेकिन अगर आप अंततः अपनी डब्ल्यूसीएफ सेवा ले लेंगे ... यह एक तीसरी बॉक्स सीमा है ... एक तीसरी हॉप, और केर्बेरोज टिकट पर्याप्त नहीं होगा।

तो ... अपनी आवश्यकताओं के बारे में पता किया जा रहा है, मैं पहली बार आप सुझाव है:

  • अपने WCF परत पर प्रमाणीकरण के बारे में भूल
  • अपने WCF सेवा का उपयोग निजी बनाएं (अपने नेटवर्किंग कौशल काम करते हैं। .. फायरवॉल एट अल)। मैं एक अलग आईआईएस वेब साइट पर डब्ल्यूसीएफ चलाने से शुरू करूंगा जो पोर्ट 80 (या 443) को नहीं सुनता है और सुनिश्चित करें कि फ़ायरवॉल आपके LAN के बाहर आईपी से आपके नए डब्ल्यूसीएफ पोर्ट तक पहुंच जाएगा (या इससे भी बेहतर, आपके सफेद के बाहर सूची (अब के लिए स्थानीय होस्ट))।
  • उपयोगकर्ता पहचान को प्रत्येक डब्ल्यूसीएफ कॉल के पैरामीटर के रूप में निर्दिष्ट करें। या यदि आप जंगली महसूस कर रहे हैं, तो एसओएपी शीर्षकों के माध्यम से उपयोगकर्ता पहचान निर्दिष्ट करने के तरीकों का पता लगाएं (यदि आपका डब्ल्यूसीएफ एसओएपी का उपयोग करता है)। कस्टम हेडर को भी ठीक करना चाहिए। तब आप अपने वेब साइट पर भरोसा सही ढंग से चुनौती देने और उन्हें अपने WCF सेवाओं तक पहुँच देने से पहले उपयोगकर्ताओं को प्रमाणित करने होंगे।

मैं अब तक इस कई बार चल रहा है देखा है। एक निजी सेवा पर प्रमाणीकरण के न होने का एक अच्छा प्रदर्शन सौदा है, लेकिन आप सावधानियों सामान्य रूप में कारण, आईटी हमलों का सबसे आंतरिक लैन से आते हैं लेने के लिए की जरूरत है।