ASP.NET олицетворяет NT AUTHORITY\IUSR, но олицетворение отключено. Ошибка ASP.NET?

У меня есть приложение ASP.NET 4.0, работающее в Windows 7 / IIS 7.5 в пуле приложений "ASP.NET v4.0 Classic", которое настроено для работы в качестве сетевой службы. Приложение имеет обработчик Application_EndRequest, который подключается к локальному экземпляру SQL Server. Строка подключения SQL указывает Integrated Security=SSPI. Web.config неимеет .

Когда я перехожу к 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(документ по умолчанию, настроенный в IIS) или любая другая страница .aspx; в этих случаях приложение правильно подключается к SQL Server как «NT AUTHORITY\NETWORK SERVICE», что является допустимым входом в систему.

Почему ASP.NET олицетворяет «NT AUTHORITY\IUSR» в EndRequest, даже если олицетворение отключено? Это ошибка в ASP.NET?

Следующий файл Global.asax.cs демонстрирует проблему:

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)));
    }
}

Вот результат трассировки:

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) порождает вложенный запрос к TestSite/default.aspx(который сопоставляется с ASP.default_aspx). После АСП.NET завершает обработку TestSite/default.aspx, он олицетворяет «NT AUTHORITY\IUSR», когда возобновляет обработку запроса к TestSite/.

ОБНОВЛЕНИЕ: Я отправил эту проблему в Microsoft Connect.

12
задан Michael Liu 24 May 2012 в 17:10
поделиться