Tengo una aplicación ASP.NET 4.0 ejecutándose en Windows 7/IIS 7.5 en el grupo de aplicaciones "ASP.NET v4.0 Classic", que está configurado para ejecutarse como servicio de red. La aplicación tiene un controlador Application_EndRequest
que se conecta a una instancia local de SQL Server. La cadena de conexión SQL especifica Integrated Security=SSPI
. Web.config does not have <identity impersonate="true" />
.ASP.NET se hace pasar por NT AUTHORITY IUSR pero la suplantación está deshabilitada. ¿Error de ASP.NET?
Cuando hojeo a http://localhost/TestSite/
, la excepción siguiente:
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)
Esta excepción es no inicia cuando hojeo a http://localhost/TestSite/default.aspx
(el documento predeterminado configurado en IIS) o cualquier otra página .aspx; en esos casos, la aplicación se conecta correctamente a SQL Server como "NT AUTHORITY \ NETWORK SERVICE", que es un inicio de sesión válido.
¿Por qué ASP.NET personificaría "NT AUTHORITY \ IUSR" en EndRequest aunque la suplantación esté deshabilitada? ¿Es esto un error en ASP.NET?
El siguiente archivo Global.asax.cs demuestra el problema:
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)));
}
}
Aquí está el resultado de seguimiento:
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)
Tenga en cuenta que una solicitud para TestSite/
(que se asigna a DefaultHttpHandler
) parece para engendrar una solicitud anidada a TestSite/default.aspx
(que está mapeada a ASP.default_aspx
). Después de que ASP.NET termine de procesar TestSite/default.aspx
, se hace pasar por "NT AUTHORITY \ IUSR" cuando reanuda el procesamiento de la solicitud a TestSite/
.
ACTUALIZACIÓN: He enviado este problema a Microsoft Connect.
intente http://msdn.microsoft.com/en-us/library/ms998320.aspx – Arcturus
¿Qué parte? Ya tengo el servicio de red configurado en IIS y SQL Server. –