2009-07-29 15 views
5

का उपयोग करके अस्वीकार कर दिया गया है मेरे पास क्लासिक एएसपी साइट के लिए वीबी 6 बैकएंड है। वह वीबी तब MSXML2.XMLHTTP का उपयोग कर उसी सर्वर पर एक वेब सेवा कॉल करता है। यह हमारे सभी सर्वरों को काम करता है लेकिन एक। अगर मैं अज्ञात लॉगिन स्वीकार करने के लिए वेब सेवा साइट सेट करता हूं तो यह काम करेगा हालांकि अगर मैं केवल एकीकृत सुरक्षा को मजबूर करता हूं तो एमएसएक्सएमएल एक एक्सेस अस्वीकृत त्रुटि देता है।एमएसएक्सएमएल

मैं उदाहरण here.

Set objDom = CreateObject("MSXML2.DOMDocument") 
Set objXmlHttp = CreateObject("MSXML2.XMLHTTP") 

' Load XML 
objDom.async = False 
objDom.loadXML XmlBody 

' Open the webservice 
objXmlHttp.Open "POST", AsmxUrl, False 

' Create headings 
objXmlHttp.setRequestHeader "Content-Type", "text/xml; charset=utf-8" 
objXmlHttp.setRequestHeader "SOAPAction", SoapActionUrl 

' Send XML command 
objXmlHttp.send objDom.xml 

संपादित से कोड का उपयोग कर रहा: AnthonyWJones की सलाह के बाद मैं चेकलिस्ट नीचे चला गया और यह अभी भी काम नहीं कर रहा। फिडलर का उपयोग करके यह 401 प्रतिक्रिया के साथ एक ही अनुरोध दिखाता है। प्रमाणीकरण टैब दिखाता है:

No Proxy-Authenticate Header is present. 
WWW-Authenticate Header is present: Negotiate 
WWW-Authenticate Header is present: NTLM 

हालांकि मैंने एक अजीब व्यवहार देखा। जब मैं दूरस्थ डेस्कटॉप में लॉग इन किए गए उपयोगकर्ता के प्रमाण-पत्रों का उपयोग कर वेबसाइट पर कॉल करता हूं तो यह काम करेगा। मुझे बातचीत, चुनौती, फिर 200 मिलती है और यह काम करेगी। कोई विचार यह क्यों काम करेगा जब उपयोगकर्ता दूरस्थ डेस्कटॉप के माध्यम से लॉग ऑन होता है लेकिन दूसरी बार नहीं?

+1

टूटा हुआ क्लाइंट किस ओएस चल रहा है? लक्ष्य सर्वर "सादा" का होस्टनाम है (इसमें डॉट्स हैं?)। यदि नहीं, तो इंट्रानेट जोन को असाइनमेंट प्रॉक्सी स्क्रिप्ट (http://msdn.microsoft.com/en-us/library/bb250483(VS.85).aspx) के माध्यम से हो रहा है और इस प्रकार यदि आपका क्लाइंट एप्लिकेशन नहीं है किसी कारण से प्रॉक्सी का उपयोग नहीं कर रहा है, ज़ोन असाइनमेंट विफल हो जाएगा और आप इस तरह के व्यवहार को दबाएंगे। – EricLaw

+0

विंडोज सर्वर 2003 आर 2 ओएस का उपयोग कर रहा हूं जिसका मैं उपयोग कर रहा हूं। लक्ष्य सर्वर का होस्टनाम सादा है और इसमें कोई बिंदु नहीं है। यदि मैं ब्राउज़र का उपयोग कर webservice पर नेविगेट करता हूं तो यह स्थानीय इंट्रानेट जोन के रूप में दिखाता है।इंटरनेट विकल्प में -> कनेक्शन -> LAN सेटिंग्स 3 में से कोई भी बॉक्स चेक नहीं किया गया है। शायद यह उस उपयोगकर्ता के लिए एक्सप्लोरर लोड नहीं होने पर एक अलग कॉन्फ़िगरेशन का उपयोग करने का प्रयास कर रहा है? – Ryan

उत्तर

3

मुझे लगता है कि आप विंडोज एकीकृत सुरक्षा का उपयोग कर सर्वर द्वारा चुनौती देने पर सर्वर पर वर्तमान उपयोगकर्ता प्रमाण-पत्र प्रस्तुत करने के लिए अंतर्निहित WinINET HTTP स्टैक पर भरोसा कर रहे हैं।

WinINET केवल डिफ़ॉल्ट रूप से ऐसा करेगा यदि यह होस्ट सर्वर को इंट्रानेट जोन में मानता है। फिर भी यह संभव है कि उपयोगकर्ताओं को इंट्रानेट जोन सुरक्षा सेटिंग्स को अस्वीकार करने के लिए समायोजित किया गया हो।

उसी उपयोगकर्ता के रूप में लॉग ऑन होने पर क्लाइंट मशीन से ब्राउज़र के साथ साइट को विस्टिंग करने का प्रयास करें जिसे आप VB6 ऐप चलाते हैं। यह सर्वर किस क्षेत्र में रहने पर विचार करता है? यदि यह इंट्रानेट नहीं है तो आपको ज़ोन से संबंधित साइटों की सूची में होस्ट जोड़ना होगा। जबकि आप वहां ज़ोन सुरक्षा सेटिंग्स खोलते हैं और उपयोगकर्ता प्रमाणीकरण श्रेणी पर स्क्रॉल करते हैं। लॉगऑन को "इंट्रानेट ज़ोन में केवल स्वचालित लॉगऑन" के रूप में कॉन्फ़िगर किया जाना चाहिए।

संपादित करें: आपकी टिप्पणी से इन चीजों को सही तरीके से कॉन्फ़िगर किया गया है। कुछ चीजें जो मैं होंगी: -

  1. जांचें कि सर्वर केवल विंडोज एकीकृत सुरक्षा को स्वीकार करने के लिए कड़ाई से कॉन्फ़िगर किया गया है।
  2. मशीन पर प्रॉक्सी सेटिंग्स की जांच करें, अनुमति प्रॉक्सी सर्वर के साथ किसी समस्या से इनकार कर दी गई है?
  3. यह सुनिश्चित करने के लिए कि एमएसएक्सएमएल डीएल का सही संस्करण इस्तेमाल किया जा रहा है (अन्य तृतीय-पक्ष ऐप्स के कुछ इंस्टॉलेशन रजिस्ट्री को नुकसान पहुंचा सकते हैं जो एमएसएक्सएमएल के पुराने संस्करण के लिए अग्रणी है) का उपयोग कर प्रोगिड "MSXML2.XMLHTTP.3.0" का उपयोग करें।
  4. मशीन पर Fiddler इंस्टॉल करें और जब VB6 ऐप कॉल का प्रयास करता है तो http वार्तालाप देखें। क्या कोई 401 प्रतिक्रिया है? WinINET उपयोगकर्ता प्रमाण-पत्र का उपयोग नहीं करता है? क्या 3 401 प्रतिक्रियाएं हैं? WinINET ने मौजूदा उपयोगकर्ताओं के क्रेडेंशियल्स का उपयोग करने का प्रयास किया है लेकिन वे सर्वर द्वारा स्वीकार नहीं किए जाते हैं।

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

सर्वर इवेंट लॉग की जांच करें, क्या सर्वर डोमेन नियंत्रक से संपर्क करने में असमर्थ है।

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

+0

वेब सेवा स्थानीय इंट्रानेट ज़ोन दोनों में है और इसे "इंट्रानेट ज़ोन में केवल स्वचालित लॉगऑन" के रूप में कॉन्फ़िगर किया गया है। कोई अन्य विचार? – Ryan

+0

आपकी अतिरिक्त प्रतिक्रिया के लिए धन्यवाद। मैंने अपने प्रश्नों के परिणामों के साथ अपने प्रश्न को अद्यतन किया है। यदि मैं सीधे वेब सेवा पर ब्राउज़ करता हूं तो यह ठीक काम करता है, मुझे केवल समस्याएं होती हैं जब मैं इसे वीबी डीएलएल से कॉल कर रहा हूं। – Ryan

0

सब बातों को देखने के बाद AnthonyWJones सुझाव दिया मैंने पाया कि मैं ऐसा करके बुनियादी प्रमाणीकरण का उपयोग कर सकते हैं:

objXmlHttp.Open "POST", AsmxUrl, False, UserName, Password 

अगर मैं एकीकृत सुरक्षा यह बातचीत करने के लिए, लेकिन फिर 401 असफल और कोशिश करेंगे की अनुमति दी है, लेकिन अगर केवल बुनियादी प्रमाणीकरण की अनुमति है यह कनेक्ट होगा। यह मेरी पहली पसंद नहीं है लेकिन यह अज्ञात पहुंच की अनुमति देने से बेहतर कामकाज है। मैं थोड़ी देर के लिए यह खुला छोड़ दूंगा, किसी को यह समझाने में मदद मिलेगी कि एकीकृत सुरक्षा कैसे प्राप्त करें, लेकिन फिर एंथनी WJones को स्वीकार्य उत्तर दें क्योंकि उसकी चेकलिस्ट अच्छी है और मुझे यह दूसरा विकल्प ढूंढने का मौका मिला।

फिडलर यह सब खोजने में बहुत मददगार था।

3

शायद रयान का जवाब देने में बहुत देर हो चुकी है, लेकिन अन्य लोगों के पास एक ही समस्या हो सकती है, इसलिए मैं इसे पोस्ट करूंगा: मेरे पास एक डेवलपर है जो MSXML2.XMLHTTP के साथ एक ही समस्या में चल रहा है। बात यह है कि मेरे पास नमूने हैं जो इसे पीछे से करते हैं, इसलिए मुझे पता है कि काम करने के लिए इस्तेमाल किया गया था, लेकिन अब यह नहीं है ... शायद हाल ही में एक बग पेश किया गया है? हम WinINET स्टैक द्वारा स्थानीय इंट्रानेट के स्वचालित पहचान पर भरोसा कर रहे थे और फिर स्टैक विंडोज इंटीग्रेटेड करने के लिए तैयार होगा। साइट प्रॉक्सी बाईपास सूची में थी, जो डिफ़ॉल्ट विकल्पों के साथ इसे स्थानीय इंट्रानेट में रखती है। और वास्तव में, जब आप साइट पर ब्राउज़ करते हैं, और सुरक्षा सेटिंग्स टैब पर जाते हैं, तो आप देखते हैं कि स्थानीय इंट्रानेट हाइलाइट किया गया है, इसलिए ऐसा लगता है कि यह काम कर रहा है। हालांकि, MSXML2.XMLHTTP अभी भी विंडोज इंटीग्रेटेड करने के लिए तैयार नहीं है ... जब तक आप सुरक्षा टैब पर साइट्स/उन्नत बटन का उपयोग करके सीधे स्थानीय इंट्रानेट में साइट जोड़ते हैं।

तो मेरा निष्कर्ष यह है कि WinINET स्टैक में अब कुछ प्रकार की बग है जो स्थानीय इंट्रानेट साइटों को सीधे साइट सूची में जोड़े गए लोगों की तुलना में अलग-अलग पता लगाती है। मजाकिया बात यह है कि, साइट पर ब्राउज़िंग, चीजें उम्मीद के अनुसार काम करती हैं, और विंडोज इंटीग्रेटेड स्वचालित रूप से उपयोग की जाती है (यहां तक ​​कि सीधे साइट पर जोड़ने के बिना): यह केवल MSXML2.XMLHTTP के माध्यम से प्रोग्रामेटिक एक्सेस है जो काम नहीं करता है।

आखिरकार, यह वही नहीं है जो हमने किया है: हमने MSXML2.ServerXMLHTTP.6.0 का उपयोग किया था। उस स्टैक (WinHTTP) को चीजों को सही लगता है, हालांकि, एक चेतावनी है: यह डिफ़ॉल्ट रूप से आईई की प्रॉक्सी सेटिंग्स का उपयोग नहीं करता है, और इसलिए आपके पास कुछ विकल्प हैं - प्रॉक्सी सीएफजी (एक्सपी और पहले के लिए) या Vista के लिए नेटस्एच का उपयोग करें और बाद में WinHTTP स्टैक में आईई प्रॉक्सी सेटिंग्स आयात करने के लिए। इसके साथ डाउनसाइड प्रत्येक क्लाइंट मशीन पर अतिरिक्त कॉन्फ़िगरेशन है (यह एक वसा क्लाइंट वीबी ऐप था)। क्या हम बजाय करने के लिए चुना है निम्नलिखित बस से पहले संदेश डालने के लिए किया गया था:

HTTP.SetProxy 2, "myproxy.mydomain.com", "* .mydomain.com"

तुम जा रही होगी के बाद से एक mydomain साइट पर, आपको लगता है कि आप प्रॉक्सी को बाईपास करने के लिए HTTP.SetProxy 0 कह सकते हैं, लेकिन यह काम नहीं करता है। ढेर को बताया जाना चाहिए: "मेरे पास प्रॉक्सी है, लेकिन इसे मेरे डोमेन के लिए बाईपास करें, और वैसे, जिस साइट पर मैं जा रहा हूं वह उस डोमेन में है, इसे स्थानीय इंट्रानेट से गुजरना है"।

+0

प्रतिक्रिया के लिए धन्यवाद। यदि संभव हो तो मैं अंततः बुनियादी प्रमाणीकरण का उपयोग करने से दूर रहना चाहता हूं। – Ryan

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

  • कोई संबंधित समस्या नहीं^_^