2011-03-02 10 views
6

जब मैं निम्न कोड के साथ ग्राहक पर क्रेडेंशियल प्रदान:डब्ल्यूसीएफ कॉल के सेवा पक्ष में उपयोगकर्ता नाम और पासवर्ड कैसे प्राप्त करें?

myChannelFactory.Credentials.UserName.UserName = "username"; 
myChannelFactory.Credentials.UserName.Password = "password"; 

तो सर्वर साइड पर मुझे लगता है कि इन क्रेडेंशियल

operationContext.IncomingMessageHeaders[1] 

में उपलब्ध हैं लेकिन वहाँ उपयोगकर्ता नाम प्राप्त करने के लिए किसी भी अधिक convenenient तरीका है और पारण शब्द? मैं देखता हूं कि OperationContext गुणों और अवांछित सूचियों का अराजकता है और मुझे कुछ भी नहीं मिला जो इंगित करता है कि मैं इसे कहां प्राप्त कर सकता हूं।

+0

आपको यह क्यों चाहिए? क्या आप अतिरिक्त प्रमाणीकरण करने की कोशिश कर रहे हैं? – McKay

उत्तर

3

आप ServiceSecurityContext class पर स्थिर पर लागू ServiceSecurityContext को ऑपरेशन के लिए वर्तमान ServiceSecurityContext प्राप्त करने के लिए उपयोग कर सकते हैं।

फिर आप

आदेश साख में पारित के साथ उपयोगकर्ता की पहचान प्राप्त करने के लिए PrimaryIdentity property उपयोग कर सकते हैं। हालांकि, यह (और न ही यह होना चाहिए) नहीं होगा, पासवर्ड का खुलासा। यदि आपको वास्तव में पासवर्ड की आवश्यकता है, तो आपको संदेश स्तर पर छोड़ना होगा और हेडर का निरीक्षण करना होगा, जैसा आपने देखा है।

+0

नहीं यह कुछ और है। SecurityCServiceContext में उपयोगकर्ता विन्डोज़ क्रेडिट्स शामिल हैं। चैनल फैक्ट्री पर सेट किए गए प्रमाण-पत्रों के बाद यह कुछ अलग है। –

+0

@ कालज: नहीं, यह सच नहीं है, WindowsIdentity संपत्ति आपको विन्डोज़ क्रेडिट प्रदान करता है। प्राथमिकता पूरी तरह से कुछ और है। – casperOne

2

यह पूरी तरह से बाध्यकारी पर निर्भर है जिसका आप उपयोग कर रहे हैं, और कोई सामान्य उत्तर नहीं है।

उदाहरण के लिए

, यदि आप NetNamedPipeBinding का उपयोग करें और कर

myChannelFactory.Credentials.UserName.UserName = "username"; 
myChannelFactory.Credentials.UserName.Password = "password"; 

आप अपना समय बर्बाद कर रहे हैं: ग्राहक के पक्ष बाध्यकारी इस डेटा के साथ कुछ भी नहीं है, यह संदेश में नहीं होगा, और यह जीत हासिल की सेवा पक्ष पर बिल्कुल भी उपलब्ध नहीं है।

बाइंडिंग केवल इस डेटा का उपभोग करेगी यदि यह सुरक्षा विकल्पों के साथ कॉन्फ़िगर किया गया है जो उपयोगकर्ता नाम/पासवर्ड प्रमाण-पत्रों का उपयोग निर्दिष्ट करते हैं। ऐसा करने वाले सभी मानक बाइंडिंग प्रमाणीकरण के लिए प्रमाण-पत्रों का उपयोग करेंगे, जिसके परिणाम ServiceSecurityContext के माध्यम से सेवा में सतह पर सतह के रूप में दिखाई देंगे, जैसा कि संकेत दिया गया है, और पासवर्ड डेटा शामिल नहीं होगा।

प्रमाणीकरण का समर्थन करने के लिए, डेटा को संदेश शीर्षकों में कहीं भी ले जाना चाहिए। वास्तव में कहां और किस रूप में बाध्यकारी-निर्भर होगा। यह न मानें कि आप उन्हें हमेशा operationContext.IncomingMessageHeaders[1] में पाएंगे।

संपादित करें: आप कस्टम बाइंडिंग बनाने में सक्षम हो सकते हैं जो आपको वह चीज़ देता है जो आप ढूंढ रहे हैं।

CustomBinding binding = new CustomBinding(...); 
binding.Elements.Insert(1, 
    SecurityBindingElement.CreateUserNameOverTransportBindingElement()); 

सेवा तरफ, एक UserNamePasswordValidator प्रदान करते हैं और इस तरह साख कॉन्फ़िगर करें:

serviceHost.Credentials.UserNameAuthentication.UserNamePasswordValidationMode = 
    System.ServiceModel.Security.UserNamePasswordValidationMode.Custom; 
servicehost.Credentials.UserNameAuthentication.CustomUserNamePasswordValidator = 
    new MyUserNamePasswordValidator(); 

उपयोगकर्ता नाम और पासवर्ड तो MyUserNamePasswordValidator की Validate विधि करने के लिए वितरित किया जाएगा।

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

+0

एचएम हाँ सच है। क्या मैं कस्टम बाइंडिंग को कॉन्फ़िगर कर सकता हूं ताकि मेरे पास सर्वर की तरफ कोड के एक ही स्थान पर जानकारी के दोनों टुकड़े हों? (उपयोगकर्ता नाम/पासवर्ड और डोमेन प्रमाण-पत्रों के बारे में जानकारी) मुझे एक ही स्थान पर दोनों टुकड़ों की आवश्यकता है ताकि मैं वैध व्यक्ति का उपयोग कर सकूं। –

+0

@ कालज: मेरे उत्तर में संपादित देखें। आप कस्टम उपयोगकर्ता नाम/पासवर्ड सत्यापन कर सकते हैं। लेकिन यह सुनिश्चित नहीं है कि यह वही है जो आप खोज रहे हैं क्योंकि आप डोमेन प्रमाण-पत्रों का भी उल्लेख करते हैं। –

+0

मैं सप्ताह के अंत तक आपके सुझाव का प्रयास करूंगा। डोमेन प्रमाण-पत्रों के बारे में भ्रम को दूर करने के लिए: मैं जो खोज रहा हूं वह डोमेन + उसकी कस्टम लॉगिन/पासवर्ड में उसकी सदस्यता के माध्यम से उपयोगकर्ता को प्रमाणीकृत करने का एक तरीका है। हकीकत में मैं डोमेन सदस्यता का उपयोग करूंगा ताकि एप्लिकेशन एक ही तरीके से व्यवहार कर सके। हालांकि जब डोमेन जानकारी उपलब्ध नहीं है तो मैं कस्टम क्रेडेंशियल्स का उपयोग करने जा रहा हूं। यदि आपका समाधान डोमेन जानकारी के साथ सुलभ सुरक्षा कॉन्टेक्स्ट उत्पन्न करता है तो यह वही होगा जो मैं ढूंढ रहा हूं। –

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

  • कोई संबंधित समस्या नहीं^_^