2014-09-02 13 views
5

दिया गया एक डब्ल्यूसीएफ आराम सेवा है जो एचटीपी क्लाइंट क्रेडेंशियल टाइप के साथ चलता है। विन्डोज़ और उपयोगकर्ता को केर्बेरोस के माध्यम से प्रमाणीकृत करने के लिए मजबूर करता है।डब्ल्यूसीएफ रेस्ट सेवा ब्राउज़र के माध्यम से विंडोज प्रमाणीकरण

 private static void Main(string[] args) 
    { 
     Type serviceType = typeof (AuthService); 
     ServiceHost serviceHost = new ServiceHost(serviceType); 

     WebHttpBinding binding = new WebHttpBinding(); 
     binding.Security.Mode = WebHttpSecurityMode.TransportCredentialOnly; 
     binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows; 

     ServiceEndpoint basicServiceEndPoint = serviceHost.AddServiceEndpoint(typeof(IAuthService), binding, "http://notebook50:87"); 
     basicServiceEndPoint.Behaviors.Add(new WebHttpBehavior()); 

     Console.WriteLine("wcf service started"); 
     serviceHost.Open(); 
     Console.ReadLine(); 
    } 

    public class AuthService : IAuthService 
{ 
    public List<string> GetUserInformation() 
    { 
     List<string> userInfo = new List<string>(); 
     userInfo.Add("Environment.User = " + Environment.UserName); 
     userInfo.Add("Environment.UserDomain = " + Environment.UserDomainName); 
     if (OperationContext.Current != null && OperationContext.Current.ServiceSecurityContext != null) 
     { 
      userInfo.Add("WindowsIdentity = " + OperationContext.Current.ServiceSecurityContext.WindowsIdentity.Name); 
      userInfo.Add("Auth protocol = " + OperationContext.Current.ServiceSecurityContext.WindowsIdentity.AuthenticationType); 
     } 
     else 
     { 
      userInfo.Add("WindowsIdentity = empty"); 
     } 
     WebOperationContext.Current.OutgoingResponse.ContentType = "text/plain"; 
     return userInfo; 
    } 
} 

[ServiceContract] 
public interface IAuthService 
{ 
    [OperationContract] 
    [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, UriTemplate = "test/")] 
    List<string> GetUserInformation(); 
} 

जब मैं एक सांत्वना आवेदन के रूप में इस चलाने के लिए, और फिर एक और कंप्यूटर से इंटरनेट एक्सप्लोरर में वेबसाइट http://notebook50:87/test/ खोलते हैं, तो मैं एक 'बुरा अनुरोध की प्रतिक्रिया मिलता है। मैंने केर्बेरोस लॉगिंग को सक्षम किया, और यह मुझे KDC_ERR_PREAUTH_REQUIRED

मैं विंडोज़ सेवा बनाकर इस समस्या को हल कर सकता हूं और इसे 'स्थानीय सिस्टम खाते' के तहत चला सकता हूं। इस मामले में, एक ग्राहक प्रमाणीकृत करने में सक्षम है।

प्रश्न: स्थानीय सिस्टम के तहत एप्लिकेशन को विंडोज सेवा के रूप में चलाने के दौरान एक ही व्यवहार प्राप्त करने के लिए उपयोगकर्ता को कौन सी अनुमति/सेटिंग्स (जो इस डब्ल्यूसीएफ सेवा को चलाती है) की आवश्यकता होती है? क्या यह सेवा सिद्धांत नाम से संबंधित है?

+0

क्या होता है यदि आप नोटबुक 50 पर साझा फ़ोल्डर बनाते हैं, और इसे अपने अन्य कंप्यूटर से एक्सेस करने का प्रयास करते हैं? क्या यह लॉगिन के लिए संकेत देता है? अगर आप लॉगिन फॉर्म के साथ लॉगिन करते हैं, और फिर http: // notebook50: 87/test/तक पहुंचने का प्रयास करते हैं तो क्या यह काम करता है? –

+0

"क्या यह सेवा सिद्धांत नाम से संबंधित है" काफी संभवतः। मेरा पहला सवाल यह है कि आप केर्बेरोस का उपयोग क्यों कर रहे हैं, मैंने पिछले 2 दिनों में केर्बेरोस को बेकार कर दिया है (क्या आप वाकई एनटीएलएम का उपयोग नहीं कर सकते हैं)। दूसरा, केर्बेरोस को काम करने के लिए सही होने के लिए बड़ी संख्या में चीजों की आवश्यकता होती है, जिनमें से एक यह है कि क्लाइंट को सर्वर प्रमाणीकृत करने की आवश्यकता है ... एसपीएन यही है। एसपीएन को उस सर्वर प्रविष्टि से मेल खाना चाहिए जिसका उपयोग आप सर्वर तक पहुंचने के लिए करते हैं (इस मामले में नोटबुक 50, जो लगभग निश्चित रूप से नहीं करता है, डिफ़ॉल्ट रूप से, यदि यह भी हुआ, तो यह आपके सर्वर के FQDN पर सेट होगा)। – Aron

+1

@ जादू-माउस क्षमा करें दोस्त। आपकी टिप्पणी सहायक नहीं है। यह स्पष्ट रूप से केर्बेरोज ऑथ के साथ एक मुद्दा है। – Aron

उत्तर

3

अब यह काम कर रहा है। यह वास्तव में एसपीएन के साथ एक समस्या थी, शुरुआत में, मैंने एसपीएन को setpn -A HTTP/notebook50.foo.com सेट किया है, और इसके साथ, केर्बेरो प्रमाणीकरण काम नहीं करता है।

अब, मैंने इसे setpn -A HTTP/notebook50.foo.com उपयोगकर्ता नाम पर सेट किया है, जहां उपयोगकर्ता नाम वह उपयोगकर्ता है जिसके अंतर्गत सेवा चलती है।

एसपीएन दस्तावेज से मैंने पढ़ा है, यह मुझे स्पष्ट नहीं था कि मुझे इस तरह से उपयोगकर्ता खाता सेट करना है।

यह बहुत अच्छा होगा अगर कोई यह बता सके कि यहां क्या होता है, और शायद इस परिदृश्य के लिए एक दस्तावेज़ के लिए एक लिंक है।

0

आप इस त्रुटि को सक्रिय निर्देशिका उपयोगकर्ताओं & कंप्यूटर -> गुण -> खाते में उस उपयोगकर्ता खाते के लिए "केर्बेरोस पूर्व प्रमाणीकरण की आवश्यकता नहीं है" विकल्प को सक्षम कर सकते हैं।

+0

मैंने इस संपत्ति को उपयोगकर्ता खाते के लिए सक्षम किया है विंडोज़ सेवा चला रहा है। यह अभी भी काम नहीं करता है। अब सिस्टम लॉग में त्रुटि है: KRB_AP_ERR_MODIFIED। लेकिन जैसे ही मैं उपयोगकर्ता को "स्थानीय सिस्टम" पर स्विच करता हूं, सबकुछ काम करता है। – Manuel

+0

msdn विनिर्देशों के अनुसार, KRB_AP_ERR_MODIFIED जब हो सकता है: 1।मिस्चैच DNS नाम रिज़ॉल्यूशन - यह समस्या एनएलबी पर्यावरण में बहुत आम है जो आईपी या/और गुणा नेटवर्क एडेप्टर को गुणा करता है। 2. उपयोगकर्ता के पास स्थानीय एनटीएफएस एक्सेस अनुमति नहीं है। 3. वेब साइट एक गरीब अनुमति सेटिंग्स के साथ एप्लिकेशन पूल का उपयोग कर रही है। – Frix33

+0

जांचें कि क्या यह केबी आपकी मदद कर सकता है: [link] (http://support.microsoft.com/kb/558115) – Frix33

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