2012-09-14 10 views
6

मैं डब्ल्यूसीएफ के साथ एक अपेक्षाकृत सरल स्वयं-होस्टेड रीस्टफुल सेवा बनाने की कोशिश कर रहा हूं, लेकिन मैं कस्टम प्रमाणीकरण जोड़ना चाहता था। उस अंत में मैंने UserNamePasswordValidator को ओवरराइड करने का प्रयास किया। दुर्भाग्यवश, यद्यपि उपयोगकर्ता नाम/पासवर्ड संयोजन को मान्य करने के लिए इसे कहा जा रहा है, यदि उपयोगकर्ता नाम/पासवर्ड पास नहीं होता है, तो सर्वर 401 अनधिकृत के बजाए 403 निषिद्ध है, जैसा कि मैं अपेक्षा करता हूं। इससे बड़ी समस्या होगी क्योंकि यदि कोई उपयोगकर्ता पहली बार प्रमाणीकृत करने में विफल रहता है, तो उन्हें तब तक क्रेडेंशियल्स दर्ज करने के लिए कहा नहीं जाएगा जब तक वे ब्राउज़र को पुनरारंभ नहीं करते। तो मैं क्या गलत हूं?मेरी स्वयं-होस्टेड डब्ल्यूसीएफ सेवा 401 अनधिकृत की बजाय 403 निषिद्ध क्यों लौट रही है?

यह वही है मैं अब तक है:

class Program 
{ 
    static void Main(string[] args) 
    { 
     WebServiceHost host = null; 
     try 
     { 
      host = new WebServiceHost(typeof (MyService)); 
      const string uri = "http://127.0.0.1/MyService"; 
      var wb = new WebHttpBinding 
          { 
           Security = 
            { 
             Mode = WebHttpSecurityMode.TransportCredentialOnly, 
             Transport = {ClientCredentialType = HttpClientCredentialType.Basic} 
            } 
          }; 
      var ep = host.AddServiceEndpoint(typeof (IMyService), wb, uri); 
      host.Credentials.UserNameAuthentication.UserNamePasswordValidationMode = UserNamePasswordValidationMode.Custom; 
      host.Credentials.UserNameAuthentication.CustomUserNamePasswordValidator = new PasswordValidator(); 
      host.Open(); 

      Console.WriteLine("Press any key to terminate"); 
      Console.ReadKey(); 
     } 
     finally 
     { 
      if (host != null) host.Close(); 
     } 
    } 
} 

public class PasswordValidator : UserNamePasswordValidator 
{ 
    public override void Validate(string userName, string password) 
    { 
     if (null == userName || null == password) 
      throw new ArgumentNullException(); 

     if (userName == "Test" && password == "Password") return; 
     throw new WebFaultException(HttpStatusCode.Unauthorized); 
    } 
} 

मैं पहले से ही इस other, similar question पर ध्यान देने लगे है (वास्तविक ServiceContract एक भी विधि है जो एक स्ट्रिंग रिटर्न शामिल हैं), लेकिन से कोई भी वास्तव में काम पोस्ट जवाब वास्तव में काम करते हैं। मैं आशा करता हूं कि प्रश्न का एक और पूर्ण परिभाषित संस्करण कुछ बेहतर प्रतिक्रिया प्राप्त करेगा। के रूप में मैं जानता हूँ कि यह एक गैर-दस्तावेजी तकनीक है जो पर निर्भर करता है कि कैसे WCF ढेर अपवाद आंतरिक प्रबंधन करता है जहाँ तक

public override void Validate(string userName, string password) 
{ 
    if (null == userName || null == password)    
     throw new ArgumentNullException(); 
    if (userName == "Test" || password == "Password") return; 

    WebFaultException rejectEx = new WebFaultException(HttpStatusCode.Unauthorized); 
    rejectEx.Data.Add("HttpStatusCode", rejectEx.StatusCode); 
    throw rejectEx; 
} 

:

+1

इससे मदद मिल सकती है http://stackoverflow.com/questions/2198560/self-hosted-wcf-rest-service-and-basic- प्रमाणीकरण – Alex

+0

यह वास्तव में मदद नहीं करता है, लेकिन यह नैतिक समर्थन प्रदान करता है और स्पष्टीकरण :) – adhocgeek

+0

दरअसल, मैं इसे वापस लेता हूं, मैंने यह देखने के लिए काफी पढ़ा नहीं था कि वहां एक समाधान है, इस प्रश्न पर पोस्ट किए गए और स्वीकार किए गए एक के समान। – adhocgeek

उत्तर

7

इस प्रयास करें। एक दस्तावेज तरीका होना चाहिए लेकिन मुझे एक नहीं मिला है।

+0

आपने यह कहां खोजा? :) यह काम करता है, लेकिन यह मुझे इस बारे में सोच रहा है कि मैं वास्तव में डब्ल्यूसीएफ का उपयोग करना चाहता हूं ... – adhocgeek

+0

मैंने प्रतिबिंबक का उपयोग कर डब्ल्यूसीएफ कोड को देखा। –

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