2011-02-07 18 views
11

जबकि एक वेब सेवा मैं निम्नलिखित त्रुटि मिलती है बुला:HTTP अनुरोध ग्राहक प्रमाणीकरण योजना के साथ अनधिकृत है 'ntlm'

The HTTP request is unauthorized with client authentication scheme 'NTLM'. The authentication header received from the server was 'NTLM'. The HTTP request is unauthorized with client authentication scheme 'NTLM'. The authentication header received from the server was 'NTLM'.

मुझे लगता है कि, एक WCF वेब सेवा कॉल मेरी आईआईएस पर दोनों एक सिल्वरलाइट 4 आवेदन किया है (7)। मेरी WCF वेब सेवा एक और ASMX वेब सेवा, एक अलग वेब सर्वर पर स्थापित है, NTLM (विंडोज प्रमाणीकरण) का उपयोग कर कहता है। दोनों सर्वर, मेरा और एएसएमएक्स वेब सेवा होस्ट करने वाला एक ही डोमेन में है।

जब सिल्वरलाइट क्लाइंट सर्वर http://localhost/MySiteName सब कुछ ठीक काम करता है का उपयोग करने से आवेदन को खोलता है। लेकिन जब Silverlight ग्राहक एक अलग ग्राहक, जो सर्वर नहीं है, लेकिन अभी भी एक ही डोमेन में, का उपयोग कर http://MyServerName/MySiteName तो मैं त्रुटि मिलती है से आवेदन को खोलता है।

विंडोज प्रमाणीकरण मेरी IIS में सक्षम है। बेनामी प्रमाणीकरण मेरे आईआईएस में अक्षम है। मेरी WCF वेब सेवा फोन करने के लिए

बाइंडिंग विन्यास है:

<binding name="winAuthBasicHttpBinding"> 
     <security mode="TransportCredentialOnly"> 
     <transport clientCredentialType="Windows" /> 
     </security> 
    </binding> 
ASMX वेब सेवा फोन करने के लिए

बाध्यकारी विन्यास है:

<binding name="ClNtlmBinding"> 
     <security mode="TransportCredentialOnly"> 
     <transport clientCredentialType="Ntlm" /> 
     </security> 
    </binding> 
+0

बाध्यकारी विन्यास मेरी WCF वेब सेवा है : <बाध्यकारी नाम = "winAuthBasicHttpBinding"> <सुरक्षा मोड = "TransportCredentialOnly"> <परिवहन clientCredentialType = "विंडोज" /> ASMX वेब सेवा फोन करने के लिए बाध्यकारी विन्यास है: <बाध्यकारी नाम = "ClNtlmBinding "> <सुरक्षा मोड =" ट्रांसपोर्ट क्रेडेंशियल केवल "> <परिवहन क्लाइंट क्रेडेंशियल टाइप = "एनटीएलएम" /> – kruvi

उत्तर

18

ठीक है, यहाँ चीजें हैं जो मन में आ रहे हैं:

  • आपका WCF सेवा शायद आईआईएस पर चल रहे सुरक्षा संदर्भ विशेषाधिकार था है कि के तहत चलना चाहिए टी वेब सेवा कॉल करता है। आपको ऐप पूल में उपयोगकर्ता के साथ यह सुनिश्चित करना होगा कि एक डोमेन उपयोगकर्ता है - आदर्श रूप से एक समर्पित उपयोगकर्ता।
  • आप उपयोगकर्ता के सुरक्षा टोकन का उपयोग करने के बाद से my WCF web service calls another ASMX web service, installed on a **different** web server
  • प्रतिरूपण का उपयोग कर ASMX वापस करने के लिए पारित करने के लिए फिर से Windows और परीक्षण करने के लिए Ntlm बदलने का प्रयास करें प्रतिरूपण का उपयोग नहीं कर सकते हैं।

ठीक है, प्रतिरूपण पर में कुछ शब्द। मूल रूप से यह एक ज्ञात मुद्दा है कि आप प्रतिरूपण टोकन है कि आप एक सर्वर के लिए मिला है, उपयोग नहीं कर सकते अन्य सर्वर पर पारित करने के लिए है। इसका कारण यह है कि टोकन उपयोगकर्ता के पासवर्ड का उपयोग करके हैश का एक प्रकार है और मशीन से उत्पन्न मशीन के लिए मान्य है, इसलिए इसे मध्य सर्वर से उपयोग नहीं किया जा सकता है।


अद्यतन

प्रतिनिधिमंडल (अर्थात अग्रेषण एक सर्वर से अन्य सर्वर पर प्रतिरूपण) WCF के तहत संभव है। इस विषय को देखें here

+0

धन्यवाद। जब मैं ऐप पूल में डोमेन उपयोगकर्ता सेट करता हूं तो यह अच्छी तरह से काम करता है, लेकिन अब डब्ल्यूएस पर मेरी सभी कॉल ऐप पूल डोमेन उपयोगकर्ता के तहत निष्पादित की जाती हैं। क्या मैं प्रतिरूपण का उपयोग करके एएसएमएक्स डब्ल्यूएस को कॉल नहीं कर सकता, इसलिए क्लाइंट के उपयोगकर्ता सुरक्षा टोकन के तहत कॉल निष्पादित की जाती है? – kruvi

+0

बीटीडब्लू, मैं यह उल्लेख करना भूल गया कि किसी विशिष्ट उपयोगकर्ता (उसी उपयोगकर्ता जो क्लाइंट में लॉग इन है) के साथ प्रतिरूपण का उपयोग करते समय सबकुछ ठीक से काम करता है: ग्राहक = नए ClCustomersServiceClient(); क्लाइंट। क्लाइंट क्रेडेंशियल्स। विन्डोज़। आवंटित इंपर्सेशन लेवल = सिस्टम। सुरक्षा। प्रिंसिपल। टोकन इंपर्सेशन लेवेल। इंपर्सेशन; क्लाइंट। क्लाइंट क्रेडेंशियल्स। Windows.ClientCredential = नया नेटवर्क क्रेडेंशियल ("उपयोगकर्ता नाम", "पासवर्ड", "डोमेन"); प्रतिक्रिया = ग्राहक।ClCustomersQuery (अनुरोध); – kruvi

+0

मैंने अपडेट किया है, एक नज़र डालें। – Aliostad

7

प्रश्न पोस्ट होने के बाद से यह एक लंबा समय है, लेकिन मुझे एक ही परिदृश्य में एक ही समस्या का अनुभव हुआ। मेरे पास एक कंसोल एप्लिकेशन है और मैं एक वेब सेवा और हमारे आईआईएस सर्वर का उपभोग कर रहा था जहां webservice रखा गया था विंडोज प्रमाणीकरण (एनटीएलएम) सक्षम है।

मैं this link पीछा किया और है कि मेरी समस्या ठीक हो गई।

<system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
      <binding name="Service1Soap"> 
       <security mode="TransportCredentialOnly"> 
        <transport clientCredentialType="Ntlm" proxyCredentialType="None" 
         realm=""/> 
        <message clientCredentialType="UserName" algorithmSuite="Default"/> 
       </security> 
      </binding> 
     </basicHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://localhost/servicename/service1.asmx" 
      binding="basicHttpBinding" bindingConfiguration="ListsSoap"/> 
    </client> 
</system.serviceModel> 
0

1) मैं अपने विन्यास के साथ निम्नलिखित करना था:: यहाँ App.config के लिए नमूना कोड (BackConnectionHostNames या अक्षम लूपबैक जाँच) http://support.microsoft.com/kb/896861

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

3) मैंने देखा कि सुरक्षा लॉग से पता चला है कि सेवा खाता एमएसडीएन आलेख में किसी एक के साथ त्रुटि के साथ लॉगिन करने में विफल रहा है।

4) बैककनेक्शनहोस्ट नामों को जोड़ना इसे बनाया गया ताकि मैं सर्वर पर चल रहे ब्राउज़र के माध्यम से सर्वर में लॉग इन कर सकूं, लेकिन वेब सेवाओं के लिए प्रमाणित करने का प्रयास करते समय सेवा खाते में अभी भी एनटीएलएम त्रुटियां थीं। मैं लूप बैक चेक को अक्षम करने में घायल हो गया और यह मेरे लिए तय कर दिया।

0

शायद तुम उल्लेख कर सकते हैं करने के लिए: http://msdn.microsoft.com/en-us/library/ms731364.aspx मेरे समाधान 2 गुण authenticationScheme और proxyAuthenticationScheme करने के लिए "NTLM" बदलने के लिए है, और फिर यह काम करता है।

पुनश्च: मेरी माहौल है का पालन के रूप में - सर्वर साइड: .net 2.0 ASMX - क्लाइंट साइड: .net 4

1

मैं से

client.ClientCredentials.UserName.UserName = domain + "\\" + username; client.ClientCredentials.UserName.Password = password

के लिए डोमेन, उपयोगकर्ता नाम, पासवर्ड को स्थानांतरित करने के लिए किया था

client.ClientCredentials.Windows.ClientCredential.UserName = username; client.ClientCredentials.Windows.ClientCredential.Password = password; client.ClientCredentials.Windows.ClientCredential.Domain = domain;

2

मेरे लिए समाधान "NTLM" का उपयोग क्रेडेंशियल प्रकार, जेरोन कश्मीर के समाधान के रूप में समान रूप के अलावा था। अगर मैं अनुमति स्तर मैं करूंगा प्लस अपने पद पर है, लेकिन मुझे मेरे पूरे कोड यहाँ पोस्ट करते हैं, जो Windows और मूल प्रमाणीकरण जैसे अन्य क्रेडेंशियल प्रकार दोनों का समर्थन करेंगे था: फोन करने के लिए

XxxSoapClient xxxClient = new XxxSoapClient(); 
    ApplyCredentials(userName, password, xxxClient.ClientCredentials); 

    private static void ApplyCredentials(string userName, string password, ClientCredentials clientCredentials) 
    { 
     clientCredentials.UserName.UserName = userName; 
     clientCredentials.UserName.Password = password; 
     clientCredentials.Windows.ClientCredential.UserName = userName; 
     clientCredentials.Windows.ClientCredential.Password = password; 
     clientCredentials.Windows.AllowNtlm = true; 
     clientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation; 
    } 
संबंधित मुद्दे