2012-05-09 17 views
12

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.

+0

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

+0

¿Qué parte? Ya tengo el servicio de red configurado en IIS y SQL Server. –

Respuesta

1

¿por qué el intento de aplicación a iniciar la sesión como "NT AUTHORITY \ IUSR" a pesar de que la aplicación es (probablemente) no se utiliza la suplantación?

Si lo hace

<identity impersonate="true"/> 

que se hará pasar por el usuario conectado

Si lo hace

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

que se hará pasar por el usuario, situado por encima.

Pero si no se hace pasar por nada y usa la autenticación de Windows, tendría sentido que use una cuenta de sistema predeterminada.

No sé por qué hace el primer intento como IUSR y luego cambia automáticamente a SERVICIO DE RED en solicitudes posteriores. Pero sí sé que cuando se salta de un servidor a otro, las credenciales del grupo de aplicaciones NO se utilizan. A menos que configure un usuario suplantado como se muestra a continuación, el SERVICIO DE RED es la cuenta predeterminada que se utiliza para buscar recursos fuera del servidor.

<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

Tanto IIS como SQL Server se están ejecutando en mi máquina de desarrollo. –

+0

He actualizado mi pregunta con algo más de información. –

22

Lo más probable, la configuración de su servidor, sitio o aplicación se establecen de manera que el modo de "Autenticación anónima" hace que las solicitudes de página para ser manejados como el usuario IUSR. No importa que su aplicación no esté solicitando suplantación; IIS lo está forzando. (Por cierto, "suplantación" es término genérico en Windows-tierra para asumir las credenciales de otro usuario no es específica de ASP.NET..)

Un poco de historia:

Por razones de seguridad, IIS permite su servidor para enviar solicitudes "anónimas" y "autenticadas" con diferentes credenciales del sistema.

Ahora, en IIS 7.5, si tiene tanto la autenticación anónima y la autenticación de formularios habilitados (lo cual es típico), antes de que sus registros de usuario del sitio web a través de las formas, se considera que su usuario "anónimo". Después de que el usuario inicie sesión con la autenticación de formularios, considera que su usuario está "autenticado".

me encontré con este comportamiento confuso al principio, porque es un cambio de IIS 6.0, que no estaba al tanto de las formas de autenticación, y considera todos los usuarios autenticados en formularios en el anonimato!

Si lo desea, puede cambiar la identidad con la que se envían las solicitudes anónimas. Mi preferencia (y también suena como la tuya) es que se ejecutan bajo las mismas credenciales del sistema que el grupo de aplicaciones de mi sitio. Para hacer IIS hacer eso, haga lo siguiente:

  1. Abra el Administrador de IIS (inetmgr)
  2. En el "Conexiones" del panel, profundizar para el nodo de su sitio y seleccionarlo
  3. En la derecha -hand panel, en el grupo "IIS", haga doble clic en el icono "Autenticación".
  4. Haga clic derecho en "Autenticación anónima" y elija "Editar ..." en el menú contextual.
  5. En el cuadro de diálogo emergente, seleccione "Identidad del grupo de aplicaciones" botón de opción.
  6. Haga clic en Aceptar.

Paso 5 también me confundió al principio, porque pensaba que "la identidad del grupo de aplicaciones" significa "el grupo de aplicaciones de pseudo-cuenta" (otra nueva característica en IIS 7.5). Lo que realmente significa, por supuesto, es "la misma cuenta en la que está configurado el grupo de aplicaciones para ejecutarse, sea lo que sea".

Si desea este comportamiento por defecto para todos sus sitios web en ese servidor, o incluso solo una aplicación en un sitio en particular, puede configurar las opciones de autenticación en esos niveles también. Simplemente seleccione el nodo que desea configurar en el panel de Conexiones, luego repita los pasos 3-6.

+0

Esto no explica por qué las solicitudes .aspx se procesan como SERVICIO DE RED de principio a fin, mientras que las solicitudes de documentos predeterminadas se procesan como SERVICIO DE RED durante la primera parte del ciclo de vida de la solicitud e IUSR durante la segunda parte. –

+0

¿Esto explica por qué he tenido que agregar inicios de sesión de seguridad "IIS AppPool \ " Y "NT AUTHORITY \ IUSR" a mi base de datos? –

Cuestiones relacionadas