2008-12-18 8 views
6

मैं एक ऐसे प्रोजेक्ट पर काम कर रहा हूं जहां मुझे निम्नलिखित की आवश्यकता है। सर्वर साइड (.NET 3.5) प्रमाण पत्र के बिना डब्ल्यूसीएफ उपयोगकर्ता नाम

  • क्लाइंट साइड के लिए WPF ग्राहक (.NET 3.0) पर

    • WCF सेवा

    मेरे पास है मैं प्रमाणीकरण का उपयोग करने के लिए है कि एक मौजूदा अनुप्रयोग और (सर्वर तरफ) से प्राधिकरण। मुझे डब्ल्यूसीएफ सेवा के थ्रेड प्रिंसिपल (साइट ऑब्जेक्ट) में उपयोगकर्ता के बारे में कुछ मेटाडेटा स्टोर करने की भी आवश्यकता है। मैं ऐसा करता हूं ताकि मैं डब्लूसीएफ सेवा में इसे प्राप्त कर सकूं यदि मुझे बिल्कुल करना है; कुछ व्यावसायिक तर्क के लिए इसकी आवश्यकता हो सकती है। तो मेरी योजना निम्नलिखित करना था ...

    सर्वर के लिए एक कस्टम सेवा प्राधिकरण प्रबंधक बनाएँ और वहां मैं उपयोगकर्ता में लॉग इन करूंगा और मौजूदा एप्लिकेशन से भूमिकाएं प्राप्त करूंगा। मैं "साइट" ऑब्जेक्ट को कैश कर दूंगा, और कैश से आगे की प्रतिक्रियाओं को खींचने पर। मुझे अपना कस्टम डेटा रखने के लिए कस्टम प्रिंसिपल ऑब्जेक्ट की भी आवश्यकता होगी। मैं प्रयोक्ता का रूप धारण करने के लिए इतना है कि मैं इस तरह WCF में छानने builtin भूमिकाओं का उपयोग कर सकते हैं:

    [PrincipalPermission(SecurityAction.Demand, Role = "Role1")] 
    public string[] RolesForUser(string username){} 
    

    मैं एक कस्टम भूमिकाएं प्रदाता के साथ ASP.NET प्राधिकरण का उपयोग करने का प्रयास किया है, लेकिन मैं स्थापित करने के लिए सक्षम नहीं था वर्तमान प्रिंसिपल पर कुछ भी। मैंने कस्टम IAuthorizationPolicy का उपयोग करने का भी प्रयास किया, लेकिन समस्याएं उत्पन्न हुईं। इन समस्याओं को WCFClient.exe एप्लिकेशन का उपयोग करने में सक्षम होने के साथ निपटाया गया था, जब यह खोज रहा था (मैक्स एंडपोइंग का उपयोग करके) यह कोई प्रमाण-पत्र नहीं देगा, इसलिए लॉगिन विफल हो जाएगा। मैंने अंततः निर्णय लिया कि एक सेवा प्राधिकरण प्रबंधक जाने का सही तरीका था, लेकिन मैं अन्य सुझावों के लिए खुला हूं।

    क्लाइंट पर मैं प्रमाण-पत्र एकत्र करूंगा और उन्हें निम्नानुसार डब्ल्यूसीएफ प्रॉक्सी कक्षा में डाल दूंगा।

    proxy.ChannelFactory.Credentials.UserName.UserName = userName; 
    proxy.ChannelFactory.Credentials.UserName.Password = password; 
    

    मैं इस मार्ग नीचे जाना शुरू कर दिया, मैंने देखा है कि मैं अपने प्रबंधक वर्ग के CheckAccessCore विधि में नाम/पासवर्ड प्राप्त करने में सक्षम नहीं था। आगे की जांच से पता चला कि मुझे वास्तव में एक कस्टम UserNamePasswordValidator में प्रमाणीकरण करना चाहिए। तो मैंने उनमें से एक बनाया। समस्या यह है कि वैध विधि कभी नहीं बुलाया जाता है।

    आगे की जांच से पता चला कि मेरी डब्ल्यूसीएफ सेवा को वैध विधि के रूप में या तो संदेश या परिवहन स्तर की सुरक्षा होनी चाहिए। इसके साथ समस्या यह है कि मैं यह नहीं समझ सकता कि X.509 प्रमाण पत्र के बिना संदेश या परिवहन स्तर की सुरक्षा कैसे प्राप्त करें। यह उत्पाद कई सौ अविश्वसनीय रूप से लॉक डाउन मशीनों में जा रहा है, और एक प्रमाणपत्र स्थापित करना संभव नहीं है।

    क्या कोई प्रमाण पत्र स्थापित किए बिना मैं क्या पूछ रहा हूं?

  • उत्तर

    6

    संक्षिप्त उत्तर; आप नहीं कर सकते जैसे ही आप उपयोगकर्ता नाम/पासवर्ड का उपयोग करते हैं, आपको किसी प्रकार के सुरक्षित चैनल की आवश्यकता होती है।

    हालांकि आपको ग्राहकों पर प्रमाणपत्र की आवश्यकता नहीं है; केवल सर्वर पर।

    22

    दरअसल यह संभव है, लेकिन आपको अपने बाध्यकारी को लागू करने की आवश्यकता होगी।

    यारॉन नवीन ने एक डब्ल्यूसीएफ बाध्यकारी विकसित किया जो HTTP पर स्पष्ट टेक्स्ट उपयोगकर्ता नाम/पासवर्ड सक्षम करता है। उनके article में बाध्यकारी के लिए कोड शामिल है।

    1

    मुझे आपके नेटवर्क आधारभूत संरचना का विवरण नहीं पता है, लेकिन यदि आप विंडोज डोमेन में हैं, तो आपको विंडोज क्रेडेंशियल्स का उपयोग करने पर विचार करना चाहिए।

    यदि आप Windows प्रमाण-पत्रों का उपयोग करते हैं तो प्रमाणपत्र के बिना संदेश सुरक्षा का उपयोग करना संभव है। यह wsHttp बाइंडिंग (बॉक्स के बाहर) का डिफ़ॉल्ट व्यवहार है।

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

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