2011-06-03 13 views
5

मैं WCF वेब सेवा है कि UserNamePasswordValidatorस्थानांतरण WCF कस्टम प्रमाणीकरण सत्र के लिए

public class CustomUserNameValidator : UserNamePasswordValidator 
    { 
    public override void Validate(string userName, string password) 
     { 
     try 
      { 
      MySession session = new MySession(userName, password); 
      } 
     catch (UnauthorizedAccessException e) 
      { 
      throw new System.IdentityModel.Tokens.SecurityTokenException("Incorrect username or password"); 
      } 
     } 
    } 

प्रमाणीकरण ठीक काम करता है का उपयोग कर कस्टम प्राधिकरण कर रहा है, लेकिन मैं नहीं जानता कि सेवा करने के लिए CustomUserNameValidator में बनाए गए सत्र स्थानांतरित करने का तरीका है।

माईशन, यदि आप सोच रहे हैं, तो तीसरे पक्ष एपीआई से आता है।

उत्तर

2

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

UserNamePasswordValidator का उपयोग न करें। परिवहन सुरक्षा का उपयोग करने के लिए अपनी सेवा को कॉन्फ़िगर करें, और क्लाइंट क्रेडेंशियल टाइप को "कोई नहीं" पर सेट करें। वेब सेवा तरीकों में क्या करना पहली बात यह है इस तरह उदाहरण के लिए, WebOperationContext.Current से निकाली गई पहचान के साथ एक सत्र बनाने के लिए किया जाएगा:

WebOperationContext operationContext = WebOperationContext.Current; 
    string encoded = operationContext.IncomingRequest.Headers[HttpRequestHeader.Authorization]; 

    if (encoded != null) 
    { 
     var decoded = Convert.FromBase64String(encoded.Substring(encoded.LastIndexOf("Basic ") + 6)); 
     var headerValue = Encoding.UTF8.GetString(decoded); 

     string userName = headerValue.Substring(0, headerValue.IndexOf(":")); 
     string password = headerValue.Substring(headerValue.IndexOf(":") + 1, headerValue.Length - userName.Length - 1); 

     if (ValidCredentials(userName, password) 
      return new MySession(userName, password); 
    } 

    operationContext.OutgoingResponse.Headers.Add(HttpResponseHeader.WwwAuthenticate, 
      String.Format("Basic realm =\"MyRealm\"", Settings.EBCommunity)); 
    throw new WebFaultException(HttpStatusCode.Unauthorized); 

इस तरह वेब सेवा आसानी से स्वयं के द्वारा होस्ट या आईआईएस पर होस्ट किया जा सकता है , और यह UserNamePasswordValidator http protocol issue से बचाता है।

+0

पर एक स्थिर विधि में लपेटना चाहते हैं, मुझे विश्वास है कि स्थिर चर आपकी मदद नहीं करेंगे। वे आवेदन व्यापक होंगे, और पूरे आवेदन पूल की लंबाई के लिए रहते हैं। इसके अलावा, मुझे विश्वास है कि, HttpContext, केवल एएसपी.NET संगतता मोड के साथ उपलब्ध है ... जो शायद आप चाहते हैं, शायद आप नहीं। संदेश निरीक्षक आपको इनपुट (इंक। Un/pw) को अवरुद्ध करने में मदद करेंगे, लेकिन सेवा कोड से उस जानकारी तक पहुंच प्राप्त करने की आपकी समस्या को सीधे हल करने में आपकी सहायता नहीं करेंगे जो अब आपके पास है। – Steve

2

मुझे लगता है कि आपकी तीसरी पार्टी लाइब्रेरी वास्तव में डब्ल्यूसीएफ के लिए नहीं बनाई गई थी, और आपको डब्ल्यूसीएफ प्राधिकरण/प्रमाणीकरण बिट्स को लागू करने की आवश्यकता है?

http://www.leastprivilege.com/CustomPrincipalsAndWCF.aspx

आप Thread.CurrentPrincipal सेट कर सकते हैं:

आप कुछ इस तरह में देखा है?

+0

हां, तीसरी पार्टी डब्ल्यूसीएफ के लिए नहीं बनाई गई है। फिलहाल IAuthorizationPolicy को अनुकूलित करने के आधार पर समाधान देख रहे हैं। एक बात निश्चित है - UserNamePasswordValidator मेरा सत्र बनाने के लिए एक खराब जगह है। अभी भी एक अच्छा समाधान खोज रहे हैं। –

+0

"माईशन" का क्या प्रतिनिधित्व करता है? मुझे लगता है कि यह पहचान की जानकारी थी। – Steve

+0

MySession तृतीय पक्ष API से एक वर्ग है जिसे उपयोगकर्ता नाम और पासवर्ड के साथ प्रारंभ किया गया है और बाद में डेटा पुनर्प्राप्त करने के लिए उपयोग किया जा सकता है। स्वाभाविक रूप से, मैं अपनी सेवा में प्रत्येक कॉल के लिए दो माईशन ऑब्जेक्ट्स बनाना नहीं चाहता हूं। –

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