ASP.NET emprunte NT AUTHORITY\IUSR mais l'usurpation d'identité est désactivé. ASP.NET bug?

J'ai un ASP.NET 4.0 application en cours d'exécution sur Windows 7 /IIS 7.5 dans l' "ASP.NET v4.0 Classique" de l'application de la piscine, qui est configuré pour s'exécuter en tant que Service Réseau. L'application dispose d'une Application_EndRequest gestionnaire qui se connecte à une instance locale de SQL Server. La chaîne de connexion SQL spécifie Integrated Security=SSPI. Web.config ne pas ont <identity impersonate="true" />.

Quand je navigue à http://localhost/TestSite/, l'exception suivante est générée:

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)

Cette exception est pas jeté quand je navigue à http://localhost/TestSite/default.aspx (le document par défaut configuré dans IIS) ou tout autre .page aspx; dans ces cas, l'application correcte de la connexion à SQL Server en tant que "NT AUTHORITY\NETWORK SERVICE", qui est un identifiant valide.

Pourquoi ASP.NET usurper l'identité d' "NT AUTHORITY\IUSR" dans EndRequest même si l'emprunt d'identité est désactivé? Est-ce un bug ASP.NET?

Générales suivantes.asax.cs fichier illustre le problème:

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

Voici la trace de sortie:

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)

Noter qu'une demande de TestSite/ (qui est mappé à DefaultHttpHandler) semble frayer un imbriquée demande à TestSite/default.aspx (qui est mappé à ASP.default_aspx). Après ASP.NET termine le traitement TestSite/default.aspx, il usurpe l'identité "NT AUTHORITY\IUSR" quand il reprend le traitement de la demande de TestSite/.

Mise à JOUR: j'ai soumis cette question à Microsoft Connect.

essayez de msdn.microsoft.com/en-us/library/ms998320.aspx
Quelle partie? J'ai déjà du Réseau des Services mis en place dans les services IIS et SQL Server.

OriginalL'auteur Michael Liu | 2012-05-09