2010-09-15 14 views
16

मैं कस्टम डब्ल्यूसीएफ प्रमाणीकरण और प्रमाणीकरण पर काम कर रहा हूं और उपयोगकर्ता नाम PasswordValidator और सेवा प्राधिकरण प्रबंधक के बारे में कुछ लेख प्राप्त कर रहा हूं।System.ServiceModel.ServiceAuthenticationManager के साथ कस्टम डब्ल्यूसीएफ प्रमाणीकरण?

मुझे कस्टम सिस्टम.ServiceModel का उपयोग करने के बारे में सुराग भी मिला। ServiceAuthenticationManager (मृत लिंक), लेकिन MSDN यह (http://msdn.microsoft.com/en-us/library/system.servicemodel.serviceauthenticationmanager.aspx) के बारे में बहुत नहीं बताता है।

तो यहां मैं हूं: सेवा प्रमाणीकरण प्रबंधक के बारे में कोई और जानता है?

सामान्य रूप से, आप कस्टम डब्ल्यूसीएफ प्रमाणीकरण कैसे स्थापित करेंगे?

+4

यह अजीब है, लेकिन अभी भी वहाँ की जानकारी और ServiceAuthorizationManager के लिए नमूने का एक बहुत हो रहा है, लेकिन शायद ही के लिए ServiceAuthenticationManager – Cocowalla

उत्तर

35

आप सही हैं, इस पर प्रलेखन कोई मदद नहीं है।

जिस तरह से मैंने इस वर्ग का उपयोग किया है, वैसे ही है।

  1. भेजे संदेश से बाहर
  2. प्रमाणीकरण टोकन (जैसे उपयोगकर्ता नाम/पासवर्ड) खींचो टोकन प्रमाणित करें और एक IPrincipal वस्तु बनाने के लिए उन्हें का उपयोग करें: प्रमाणित() विधि को ओवरराइड। यह प्रिंसिपल होगा जिसका उपयोग सेवा संचालन के आमंत्रण के दौरान किया जाता है।
  3. के रूप में यह WCF द्वारा बाद में बदल दिया गया है, तो यह WCF प्रसंस्करण पाइपलाइन

तुम सिर्फ इस बिंदु पर धागा प्रिंसिपल निर्धारित नहीं कर सकते में बाद में इस्तेमाल किया जा सकता message.Properties संग्रह करने के लिए IPrincipal वस्तु जोड़े ।

ServiceAuthenticationManager.Authenticate में कोड() पद्धतियों कुछ इस तरह दिखेगा:

public override ReadOnlyCollection<IAuthorizationPolicy> Authenticate(ReadOnlyCollection<IAuthorizationPolicy> authPolicy, Uri listenUri, ref Message message) 
{ 
    int tokenPosition = message.Headers.FindHeader("Token", "http://customnamespace.org"); 
    string token = message.Headers.GetHeader<string>(tokenPosition); 

    IPrincipal user = new CustomPrincipal(token); 

    message.Properties["Principal"] = user; 

    return authPolicy; 
} 

तो फिर तुम एक कस्टम प्राधिकरण नीति है कि

  1. संदेश से IPrincipal पुन: प्राप्त करता जोड़ने (का उपयोग करते हुए System.ServiceModel.EvaluationContext.Current.IncomingMessageProperties संग्रह)।
  2. EvaluationContext.Properties संग्रह
  3. IPrincipal.IsInRole के आधार पर दावे करती है() विधि

में IPrincipal धक्का IAuthorizationPolicy में कोड() विधि कैसा दिखेगा

public bool Evaluate(EvaluationContext evaluationContext, ref object state) 
{ 
    IPrincipal user = OperationContext.Current.IncomingMessageProperties["Principal"] as IPrincipal; 
    evaluationContext.Properties["Principal"] = user; 
    evaluationContext.Properties["Identities"] = new List<IIdentity> { user.Identity }; 

    IList<Claim> roleClaims = this.GetRoleClaims(user); 

    evaluationContext.AddClaimSet(this, new DefaultClaimSet(this.Issuer, roleClaims)); 

    return true; 
} 

सेवा व्यवहार कॉन्फ़िगरेशन में, आपको डब्ल्यूसीएफ के लिए वास्तविक सेवा संचालन आमंत्रण के लिए निष्पादन थ्रेड पर प्रिंसिपल के रूप में प्रिंसिपल सेट करने के लिए प्रिंसिपलप्रमिशनमोड = "कस्टम" सेट करने की आवश्यकता है।

<serviceAuthorization principalPermissionMode="Custom"... 
+1

धन्यवाद कुछ भी, यह बहुत उपयोगी था। चीयर्स :-) – fredlegrain

+0

क्या सेवा प्रमाणीकरण प्रबंधक में दावासेट में पहचान दावा जोड़ना संभव है।प्रिंसिपल को गुणों में डालने के बजाय प्रमाणीकरण()? –

+1

यह संभव है। इच्छित प्रवाह मुझे लगता है कि प्रमाणीकरण प्रबंधक प्रमाण-पत्रों को मान्य करता है और सीधे प्रदाता से आने वाले दावों के साथ प्रिंसिपल बनाता है (एक पहचान दावा इनमें से एक होगा), प्राधिकरण नीतियां दावों को बदलती हैं और प्राधिकरण प्रबंधक प्राधिकरण निर्णय लेता है। इस पर दस्तावेज दुर्लभ है हालांकि यह कहना मुश्किल है। वैसे भी, अब WIF मॉडल उपलब्ध है सरल है: ओ) –

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