2009-03-14 16 views
13

मेरे पास TcpClient/TcpListener और SslStream के आधार पर एक साधारण क्लाइंट-सर्वर एप्लिकेशन है। ग्राहक X509 प्रमाण पत्र का उपयोग कर सर्वर पर स्वयं प्रमाणित कर सकते हैं या एसएसएलस्ट्रीम स्थापित होने के बाद उपयोगकर्ता नाम और पासवर्ड भेजकर।अपने क्लाइंट-सर्वर एप्लिकेशन में System.IdentityModel का उपयोग कैसे करें

WCF सत्यापन के लिए System.IdentityModel नाम स्थान का उपयोग करता है, लेकिन apparently कि मनमाने ढंग से अनुप्रयोगों में प्रयोग किया जा सकता है - जो दिलचस्प लगता है। हालांकि यह कैसे करना है इस बारे में जानकारी स्पैस है (या मेरा Google foo आज कमजोर है)।

तो, मेरा प्रश्न है: मुझे अपने आवेदन के साथ System.IdentityModel को एकीकृत करने के लिए क्या करने की आवश्यकता है? मुझे यकीन नहीं है कि मुझे उन सभी दावों की ज़रूरत है, लेकिन यह अच्छा होगा अगर उपयोगकर्ता अपने विंडोज खाते या किसी अन्य प्रदत्त प्रमाणीकरण तंत्र का उपयोग कर लॉग इन कर सकें। (दुर्भाग्य से मैं सिर्फ डब्ल्यूसीएफ पर स्विच नहीं कर सकता लेकिन कस्टम प्रोटोकॉल का उपयोग करना चाहता हूं, हालांकि यदि आवश्यक हो तो मैं इसमें कुछ बदलाव कर सकता हूं।)

उत्तर

17

मेरा Google foo वास्तव में कमजोर था। जवाब मेरे प्रश्न के लिंक के ठीक पीछे है। तो अगर किसी के पास एक ही प्रश्न है तो this blog के कुछ लिंक यहां दिए गए हैं।

सबसे पहले, आप को समझने के लिए "का दावा है कि सामान सेट" प्रयास करना चाहिए:

,210

उसके बाद, आप पता करने की जरूरत है, जहां दावा सेट से आते हैं: इस ज्ञान के साथ

सशस्त्र, यह वास्तव में काफी आसान हो जाता है।

अगर मैं इसे सही ढंग से समझते हैं, बुनियादी कार्यप्रवाह कुछ इस तरह होगा:

  1. ग्राहक एक SecurityToken एक SecurityTokenProvider
  2. क्लाइंट का उपयोग कर बनाता है serializes SecurityToken एक SecurityTokenSerializer
  3. सर्वर का उपयोग SecurityToken deserializes का उपयोग कर SecurityTokenSerializer
  4. सर्वर एस SecurityTokenAuthenticator
  5. का उपयोग कर बनाता है
  6. सर्वर बनाता AuthorizationContextIAuthorizationPolicy रों से
  7. हो गया

उदाहरण:

// Create the SecurityTokenProvider 
var p = new UserNameSecurityTokenProvider("username", "password"); 

// Get the SecurityToken from the SecurityTokenProvider 
var t = p.GetToken(TimeSpan.FromSeconds(1.0)) as UserNameSecurityToken; 

// ... transmit SecurityToken to server ... 

// Create the SecurityTokenAuthenticator 
var a = new CustomUserNameSecurityTokenAuthenticator(
    UserNamePasswordValidator.None); 

// Create IAuthorizationPolicies from SecurityToken 
var i = a.ValidateToken(t); 

// Create AuthorizationContext from IAuthorizationPolicies 
var c = AuthorizationContext.CreateDefaultAuthorizationContext(i); 
ShowClaims(c.ClaimSets); 

X509SecurityToken के लिए एक X509SecurityTokenProvider/Authenticator का उपयोग करें। WindowsSecurityToken के लिए WindowsSecurityTokenAuthenticator है लेकिन प्रदाता नहीं है;

var t = new WindowsSecurityToken(WindowsIdentity.GetCurrent()); 

यह काफी अच्छी तरह से काम करता है: के बजाय, WindowsSecurityToken निर्माता का उपयोग करें। एकमात्र चीज जो मैंने अभी तक छोड़ी है वह टोकन क्रमबद्धता है। एक SecurityTokenSerializer वर्ग है जिसमें .NET ढांचे में एक कार्यान्वयन है: WSSecurityTokenSerializer कक्षा जो डब्ल्यूसीएफ के साथ आता है।

Serializing UserNameSecurityToken और X509SecurityToken एक आकर्षण की तरह काम करता है (अक्रमांकन की कोशिश की है नहीं), लेकिन WindowsSecurityToken रों जाहिरा तौर पर serializer द्वारा समर्थित नहीं हैं। यह मुझे दो प्रमाणीकरण विधियों के साथ छोड़ देता है जो मेरे पास पहले से ही हैं (प्रमाणपत्र और उपयोगकर्ता नाम/पासवर्ड) और, जैसा कि मैं AuthorizationContext वैसे भी नहीं चाहता था, मैं अपने पास जो भी रखता हूं उसके साथ रहूंगा :)

+1

यदि कोई दिलचस्पी लेता है, तो मुझे यकीन नहीं है कि सुरक्षा टोकन क्लाइंट साइड पर बनाया जाना चाहिए और सर्वर पर प्रेषित होना चाहिए। X.50 9 सुरक्षा के लिए सर्वर के साथ एसएसएलस्ट्रीम शुरू करने और सर्वर प्रमाण पत्र से X509SecurityToken बनाने के लिए और अधिक समझदारी होती है, विंडोज सुरक्षा के लिए WindowsSecurityToken को वार्तालाप से बनाया जा सकता है। ReemoteIdentity यदि NegotiateStream का उपयोग किया जाता है। उपयोगकर्ता नाम/पासवर्ड सुरक्षा के लिए, ज़ाहिर है, उपयोगकर्ता नाम और पासवर्ड प्रसारित करने की आवश्यकता होगी। – dtb

7

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

+1

मैंने निश्चित लिंक को दर्शाने के लिए उपरोक्त @ डीटीबी के उत्तर को संपादित किया है।इसे पीयर की समीक्षा के तुरंत बाद दिखाना चाहिए। धन्यवाद! –

+0

सितंबर 2016 तक कुछ लिंक टूटे हुए हैं – JPK

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

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