2012-05-09 11 views
12

मेरे पास "एएसपी.नेट वी 4.0 क्लासिक" एप्लिकेशन पूल में विंडोज 7/आईआईएस 7.5 पर चल रहा एक एएसपी.NET 4.0 एप्लिकेशन है, जिसे नेटवर्क सेवा के रूप में चलाने के लिए कॉन्फ़िगर किया गया है। एप्लिकेशन में Application_EndRequest हैंडलर है जो स्थानीय SQL सर्वर इंस्टेंस से कनेक्ट होता है। SQL कनेक्शन स्ट्रिंग Integrated Security=SSPI निर्दिष्ट करती है। Web.config <identity impersonate="true" /> है।एएसपी.नेट एनटी प्राधिकरण IUSR का प्रतिरूपण करता है लेकिन प्रतिरूपण अक्षम है। एएसपी.नेट बग?

जब मैं http://localhost/TestSite/ पर ब्राउज़ करें, निम्न अपवाद फेंक दिया जाता है:

System.Data.SqlClient.SqlException (0x80131904): Login failed for user 'NT AUTHORITY\IUSR'. 
    ... 
    at System.Data.SqlClient.SqlConnection.Open() 
    at Global.Application_EndRequest(Object sender, EventArgs e) 

यह अपवाद नहीं जब मैं http://localhost/TestSite/default.aspx (डिफ़ॉल्ट दस्तावेज़ आईआईएस में विन्यस्त) या किसी अन्य .aspx पृष्ठ पर ब्राउज़ फेंक दिया है, उन मामलों में एप्लिकेशन SQL सर्वर से "एनटी प्राधिकरण \ नेटवर्क्स सेवा" के रूप में सही ढंग से कनेक्ट होता है, जो एक वैध लॉगिन है।

प्रतिरूपण अक्षम होने पर एएसपी.NET EndRequest में "एनटी प्राधिकरण \ IUSR" का प्रतिरूपण क्यों करेगा? क्या यह एएसपी.नेट में एक बग है?

ThreadId=3 http://localhost/TestSite/ BeginRequest Impersonating=False 
ThreadId=3 http://localhost/TestSite/ PreRequestHandlerExecute Impersonating=False 
ThreadId=7 http://localhost/TestSite/default.aspx BeginRequest Impersonating=False 
ThreadId=7 http://localhost/TestSite/default.aspx PreRequestHandlerExecute Impersonating=False 
ThreadId=7 http://localhost/TestSite/default.aspx PostRequestHandlerExecute Impersonating=False 
ThreadId=7 http://localhost/TestSite/default.aspx EndRequest Impersonating=False 
ThreadId=7 http://localhost/TestSite/ PostRequestHandlerExecute Impersonating=True 
ThreadId=7 http://localhost/TestSite/ EndRequest Impersonating=True 
System.Data.SqlClient.SqlException (0x80131904): Login failed for user 'NT AUTHORITY\IUSR'. 
    ... 
    at System.Data.SqlClient.SqlConnection.Open() 
    at Global.Application_EndRequest(Object sender, EventArgs e) 

ध्यान दें कि TestSite/ के लिए एक अनुरोध (जो DefaultHttpHandler को मैप किया है) लगता है:

public class Global : HttpApplication 
{ 
    public Global() 
    { 
     this.BeginRequest += delegate { Log("BeginRequest"); }; 
     this.PreRequestHandlerExecute += delegate { Log("PreRequestHandlerExecute"); }; 
     this.PostRequestHandlerExecute += delegate { Log("PostRequestHandlerExecute"); }; 
     this.EndRequest += delegate { Log("EndRequest"); }; 
    } 

    protected void Application_EndRequest(Object sender, EventArgs e) 
    { 
     try 
     { 
      using (SqlConnection connection = new SqlConnection("Server=.;Integrated Security=SSPI")) 
      { 
       connection.Open(); 
      } 
     } 
     catch (Exception ex) 
     { 
      Trace.WriteLine(ex); 
     } 
    } 

    private static void Log(string eventName) 
    { 
     HttpContext context = HttpContext.Current; 
     Type impersonationContextType = typeof(HttpContext).Assembly.GetType("System.Web.ImpersonationContext", true); 
     Trace.WriteLine(string.Format("ThreadId={0} {1} {2} Impersonating={3}", 
      Thread.CurrentThread.ManagedThreadId, 
      context.Request.Url, 
      eventName, 
      impersonationContextType.InvokeMember("CurrentThreadTokenExists", BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.GetProperty, null, context, null))); 
    } 
} 

यहाँ का पता लगाने उत्पादन है:

निम्नलिखित Global.asax.cs फ़ाइल समस्या को दर्शाता है घोंसलाTestSite/default.aspx (जिसे ASP.default_aspx पर मैप किया गया है) का अनुरोध करने के लिए। ASP.NET TestSite/default.aspx को संसाधित करने के बाद, यह TestSite/ पर अनुरोध संसाधित करते समय "एनटी प्राधिकरण \ IUSR" का प्रतिरूपण करता है।

अद्यतन: मैंने इस समस्या को Microsoft Connect पर सबमिट कर दिया है।

+0

http://msdn.microsoft.com/en-us/library/ms998320.aspx – Arcturus

+0

किस भाग का प्रयास करें? मेरे पास पहले से ही आईआईएस और एसक्यूएल सर्वर में नेटवर्क सेवा स्थापित है। –

उत्तर

1

एप्लिकेशन "एनटी प्राधिकरण \ IUSR" के रूप में लॉग इन करने का प्रयास क्यों करेगा, भले ही एप्लिकेशन प्रतिरूपण का उपयोग नहीं कर रहा हो?

आप

<identity impersonate="true"/> 

करते हैं यह उपयोगकर्ता

में लॉग इन का रूप धारण होगा यदि आप करते हैं

<identity impersonate="true" userName="contoso\Jane" password="pass"/> 

यह उपयोगकर्ता ऊपर सेट का रूप धारण करेगा।

लेकिन यदि आप बिल्कुल प्रतिरूपण नहीं करते हैं और विंडोज प्रमाणीकरण का उपयोग नहीं करते हैं, तो यह समझ में आता है कि यह एक डिफ़ॉल्ट सिस्टम खाता का उपयोग करता है।

मुझे नहीं पता कि यह आईयूएसआर के रूप में पहला प्रयास क्यों करता है और फिर बाद में अनुरोधों पर स्वचालित रूप से नेटवर्क सेवा पर स्विच करता है। लेकिन मुझे पता है कि जब आप एक सर्वर से दूसरे सर्वर पर कूदते हैं, तो एप्लिकेशन पूल क्रेडेंटिकल का उपयोग नहीं किया जाता है। जब तक आप नीचे दिखाए गए प्रतिरूपित उपयोगकर्ता को सेट न करें, नेटवर्क सेवा डिफ़ॉल्ट खाता है जिसका उपयोग सर्वर के बाहर संसाधन लाने के लिए किया जाता है।

<connectionStrings> 
     <add name="myConnectionString" connectionString="Data Source=MyServerName;Initial Catalog=MyDataBaseName;Integrated Security=True;" 
      providerName="System.Data.SqlClient" /> 
     </connectionStrings> 

<identity impersonate="true" userName="contoso\Jane" password="pass"/> 
+0

आईआईएस और एसक्यूएल सर्वर दोनों मेरी विकास मशीन पर चल रहे हैं। –

+0

मैंने कुछ और जानकारी के साथ अपना प्रश्न अपडेट कर लिया है। –

22

सबसे अधिक संभावना, अपने सर्वर, साइट या अनुप्रयोग के लिए सेटिंग्स सेट कर रहे हैं, ताकि "बेनामी प्रमाणीकरण" मोड का कारण बनता है पृष्ठ अनुरोधों IUSR उपयोगकर्ता के रूप में व्यवहार किया जाना है। इससे कोई फर्क नहीं पड़ता कि आपका आवेदन प्रतिरूपण का अनुरोध नहीं कर रहा है; आईआईएस इसे मजबूर कर रहा है। (वैसे, "प्रतिरूपण" किसी अन्य उपयोगकर्ता के क्रेडेंशियल्स संभालने के लिए विंडोज देश में सामान्य शब्द है यह ASP.NET के लिए विशिष्ट नहीं है।।)

के बारे में थोड़ी:

सुरक्षा कारणों से, आईआईएस की अनुमति देता है अलग-अलग सिस्टम प्रमाण-पत्रों के तहत आपका सर्वर "अज्ञात" और "प्रमाणीकृत" अनुरोध फ़ील्ड करने के लिए।

अब, आईआईएस 7.5 में, यदि आप दोनों गुमनाम प्रमाणीकरण और प्रमाणीकरण सक्षम (जो आम है) में फार्म के माध्यम से फॉर्म्स, अपनी वेबसाइट उपयोगकर्ता के लॉग से पहले, यह आपके उपयोगकर्ता "गुमनाम" समझता है। आपके उपयोगकर्ता फॉर्म एथ के साथ लॉग इन करने के बाद, यह आपके उपयोगकर्ता को "प्रमाणीकृत" मानता है।

मुझे यह व्यवहार पहली बार उलझन में मिला क्योंकि यह आईआईएस 6.0 से एक बदलाव है, जो फॉर्म ऑथ से अवगत नहीं था, और सभी फॉर्म-प्रमाणीकृत उपयोगकर्ताओं को अज्ञात माना जाता था!

यदि आप चाहते हैं, तो आप पहचान बदल सकते हैं जिसके अंतर्गत अनाम अनुरोध फ़ील्ड किए गए हैं। मेरी वरीयता (और यह आपके जैसा भी लगता है) यह है कि वे के तहत मेरी साइट के ऐप पूल के समान सिस्टम प्रमाण-पत्र के तहत चलते हैं। आईआईएस बनाने के लिए क्या है कि, निम्न कार्य करें:

  1. ओपन आईआईएस प्रबंधक (inetmgr)
  2. "कनेक्शन" में पैनल, आपकी साइट की नोड के लिए विस्तार में जाकर यह
  3. चयन सही में "आईआईएस" समूह के तहत, पैनल, "प्रमाणीकरण" आइकन पर डबल क्लिक करें।
  4. "अज्ञात प्रमाणीकरण" पर राइट-क्लिक करें और संदर्भ मेनू से "संपादित करें ..." चुनें।
  5. पॉपअप संवाद में, "एप्लिकेशन पूल पहचान" रेडियो बटन का चयन करें।
  6. ठीक क्लिक करें।

चरण 5 ने मुझे पहले भी भ्रमित कर दिया, क्योंकि मैंने सोचा था कि "एप्लिकेशन पूल पहचान" का अर्थ है "एप्लिकेशन पूल छद्म-खाता" (आईआईएस 7.5 में एक और नई सुविधा)। इसका वास्तव में क्या अर्थ है, "वही खाता है जो ऐप पूल को चलाने के लिए कॉन्फ़िगर किया गया है, जो भी हो।"

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

+0

यह स्पष्ट नहीं करता है कि क्यों .aspx अनुरोधों को नेटवर्क सेवा शुरू होने से संसाधित किया जाता है, जबकि डिफ़ॉल्ट दस्तावेज़ अनुरोधों को दूसरे भाग के दौरान अनुरोध जीवन चक्र और आईयूएसआर के पहले भाग के दौरान नेटवर्क सेवा के रूप में संसाधित किया जाता है। –

+0

क्या यह समझाता है कि मुझे अपने डेटाबेस में "आईआईएस ऐपपूल \ " और "एनटी प्राधिकरण \ IUSR" सुरक्षा लॉग इन क्यों जोड़ना पड़ा? –

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