6

अंक: एएसपी.नेट 4.0 में, मैं रिपोर्टों की सूची प्राप्त करने के लिए अपने एसएसआरएस 2005 सर्वर की ReportService2005.asmx वेब सेवा का उपयोग करता हूं। .NET में भी, मैं अपने एमएस-एसक्यूएल 2005 डेटाबेस के साथ संवाद करने के लिए इकाई फ्रेमवर्क का उपयोग करता हूं। जब मैं अपने वेब सर्वर के रूप में विजुअल स्टूडियो डेवलपमेंट सर्वर का उपयोग करता हूं, तो एसएसआरएस और एसक्यूएल को ठीक काम करता है। लेकिन जब मैं आईआईएस 5.1 पर स्विच करता हूं, तो एसएसआरएस और एंटिटी कोड दोनों त्रुटियों का उत्पादन करते हैं। मैं का उपयोग केवल आईआईएस में विंडोज/एकीकृत प्रमाणीकरण का उपयोग करता हूं।आईआईएस में विंडोज/एकीकृत प्रमाणीकरण क्यों एसएसआरएस और एसक्यूएल में उपयोगकर्ता प्रमाण पत्र पास नहीं करता है?

त्रुटियाँ: SSRS के लिए, मैं The request failed with HTTP status 401: Unauthorized.

प्राप्त इकाई की रूपरेखा के लिए, मैं Login failed for user ''. The user is not associated with a trusted SQL Server connection.

का प्रयास किया गया समाधान मिलती है: Web.Config मैं <identity impersonate="true" /> जोड़ा और कहा कि तय इकाई की रूपरेखा त्रुटियों में लेकिन एसएसआरएस त्रुटियों नहीं। मैंने उपयोगकर्ता नाम और पासवर्ड शामिल करने के लिए identity संदर्भ का विस्तार किया, और यह सभी त्रुटियों को ठीक किया गया।

प्रश्न: क्यों निर्दिष्ट करने मेरी यूज़रनेम और पासवर्ड त्रुटियों को ठीक करता है, और यही कारण है कि एसक्यूएल कहता है मैं एक उपयोगकर्ता नाम ('') को निर्दिष्ट नहीं कर रहा हूँ? मैंने सोचा कि विंडोज प्रमाणीकरण स्वचालित रूप से वर्तमान उपयोगकर्ता का प्रतिरूपण करता है। मैं web.config में "सेवा" खाते को हार्डकोड किए बिना इसे कैसे ठीक कर सकता हूं?

उत्तर

10

विंडोज या एकीकृत प्रमाणीकरण का अर्थ है कि उपयोगकर्ता को विंडोज क्रेडेंशियल्स (या टोकन) का उपयोग करके पहचाना जाता है लेकिन इसका मतलब यह नहीं है कि उस उपयोगकर्ता के तहत चलने का अनुरोध। एएसपी.नेट रन-टाइम कार्यकर्ता प्रक्रिया (ऐप पूल) पहचान के तहत अनुरोध निष्पादित करेगा जबतक कि आप इसे किसी अन्य पहचान का प्रतिरूपण करने के लिए कॉन्फ़िगर नहीं करते हैं।

तो जब आप विकास सर्वर का उपयोग कर साइट तक पहुंच रहे हैं, तो सर्वर आपकी पहचान के तहत चल रहा है और इसलिए आपकी पहचान के तहत एसएसआरएस और एसक्यूएल सर्वर तक पहुंच है और यह काम करता है।

जब आप आईआईएस के तहत अपनी साइट लोड करते हैं, तो एएसपी.NET अनुरोध एप्लिकेशन पूल के लिए जो भी पहचान कॉन्फ़िगर किया गया है, के तहत चलाया जाएगा। आम तौर पर यह पहचान स्थानीय उपयोगकर्ता है और इसलिए एसएसआरएस या एसक्यूएल सर्वर जैसे नेटवर्क संसाधनों तक पहुंच अस्वीकार कर दी जाएगी। <identity impersonate="true" username="your name" ../> जोड़ना, एएसपी.नेट आपकी पहचान के तहत अनुरोध चलाएगा और इसे एसएसआरएस और एसक्यूएल सर्वर दोनों के लिए काम करना चाहिए।

उत्सुक मामला यहां <identity impersonate="true" /> है - इस सेटिंग के तहत, एएसपी.नेट वर्तमान में प्रमाणीकृत विंडोज पहचान का प्रतिरूपण करेगा। हालांकि, इसके लिए सही तरीके से काम करने के लिए, आपने एकीकृत प्रमाणीकरण पर आईआईएस और एएसपी.नेट दोनों को कॉन्फ़िगर किया है और अनाम पहुंच से इनकार कर दिया है (एएसपी.नेट के साथ-साथ आईआईएस में)। ऐसा करने में विफल होने के परिणामस्वरूप वर्तमान उपयोगकर्ता की पहचान प्रमाणित नहीं हो सकती है और अनुरोध अज्ञात उपयोगकर्ता की पहचान के तहत चलाया जाएगा (जैसा कि आईआईएस में कॉन्फ़िगर किया गया है)। यदि आपने आईआईएस में एकीकृत प्रमाणीकरण चिह्नित किया है लेकिन एएसपी.नेट में नहीं है तो पहचान एएसपी.NET अनुरोध को पास नहीं की जाएगी। आपको यह देखने के लिए अपने पर्यावरण की जांच करनी होगी कि आपको किस सटीक परिदृश्य का सामना करना पड़ा था, लेकिन अंतिम परिणाम यह था कि आपका एएसपी.NET अनुरोध क्रेडेंशियल के तहत चल रहा था जिसके पास SQL ​​सर्वर तक पहुंच है लेकिन एसएसआरएस नहीं है।

+0

+1 ठोस उत्तर। – JonH

+1

आप सही हैं। मैं web.config और '((WindowsIdentity) HttpContext.Current.User.Identity) में' <पहचान प्रतिरूपण = "सत्य" /> 'का उपयोग करके समाप्त हुआ। एसएसआरएस के संदर्भ के लिए IMPersonate()' और सही ढंग से मुझे प्रतिरूपित किया गया । –

6

आपको 'डबल हॉप' मुद्दे से अवगत होने की भी आवश्यकता है - इसका मतलब है कि आपके क्रेडेंशियल का उपयोग केवल दो बार किया जा सकता है।

यदि आप Windows प्रमाणीकरण और प्रतिरूपण का उपयोग कर वेबसाइट तक पहुंच रहे हैं, तो वह वेबसाइट आपके जैसी दूसरी सेवा कॉल कर सकती है। यदि वह अन्य सेवा एक और वेबसाइट है (यानी रिपोर्टिंग सेवाएं) जो बदले में दूसरी सेवा (उदा।डेटाबेस) यह फिर से आपके क्रेडेंशियल पास नहीं कर सकता है। इसका अर्थ यह है कि यदि उपयोगकर्ता उपयोगकर्ता से प्रमाण-पत्र की अपेक्षा करता है तो डेटाबेस एक त्रुटि फेंक देगा।

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