Error de inicio de sesión para el usuario 'IIS APPPOOL \ ASP.NET v4.0'

432

Tengo un proyecto web (C # Asp.Net, EF 4, MS SQL 2008 e IIS 7) y necesito migrarlo a IIS 7 localmente (en este momento funciona bien con CASSINI).

Localmente en IIS tengo mi Default Web Sitecon mi implementación. Tanto mi despliegue como Default Web Siteen el grupo ASP.NET v4.0 (buscar imagen para la configuración), el grupo objetivo Framework 4 como mi proyecto web. Pool Settings Al visitar el sitio, el navegador no muestra la página y permite que el navegador descargue la página.

Tengo otros proyectos ejecutándose en IIS localmente y funcionan sin problemas (pero no usan Entity Framework).

Usando el registrador de eventos veo los errores a continuación:

Exception information: 
    Exception type: EntityException 
    Exception message: The underlying provider failed on Open.
   at System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf(Boolean openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection, String exceptionCode, String attemptedOperation, Boolean& closeStoreConnectionOnFailure)


    Login failed for user 'IIS APPPOOL\ASP.NET v4.0'.
       at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
       at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
       at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
       at System.Data.SqlClient.SqlConnection.Open()
       at System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf(Boolean openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection, String exceptionCode, String attemptedOperation, Boolean& closeStoreConnectionOnFailure)

Pregunta relacionada

ACTUALIZACIÓN: Puede leer en los recursos sobre esta pregunta que los permisos deben otorgarse manualmente en MS SQL 2008 como se explica en su respuesta. Con IIS 7.5 y MS SQL 2008 R2, no debería ser necesario configurar manualmente el permiso.

GibboK
fuente
2
¿Ha permitido el permiso de identidad del grupo de aplicaciones en la carpeta del sitio web?
Christian
No estoy seguro, ¿podría decirme cómo hacerlo?
GibboK
en realidad, como dice a la deriva, esto podría ser un problema de seguridad SQL. Es mejor configurar una cuenta de usuario NT para el AppPool y luego otorgar ese permiso a la carpeta del sitio web y a las tablas correspondientes en SQL
Christian
1
@GibboK: Le animo a que revise la respuesta aceptada aquí y elija una respuesta más apropiada. La respuesta aceptada está llevando a muchas personas a un agujero negro de seguridad. Si, funciona. No, realmente no es una buena idea. Ver mis comentarios a continuación.
gastador

Respuestas:

596

Parece que está fallando al intentar abrir una conexión a SQL Server.

Debe agregar un inicio de sesión a SQL Server para IIS APPPOOL\ASP.NET v4.0 y otorgar permisos a la base de datos.

En SSMS, debajo del servidor, expanda Seguridad, luego haga clic con el botón derecho en Inicios de sesión y seleccione "Nuevo inicio de sesión ...".

En el cuadro de diálogo Nuevo inicio de sesión, ingrese el grupo de aplicaciones como nombre de inicio de sesión y haga clic en "Aceptar".

ingrese la descripción de la imagen aquí

A continuación, puede hacer clic con el botón derecho en el inicio de sesión para el grupo de aplicaciones, seleccionar Propiedades y seleccionar "Asignación de usuarios". Verifique la base de datos apropiada y los roles apropiados. Creo que podría seleccionar db_datareadery db_datawriter, pero creo que aún necesitaría otorgar permisos para ejecutar procedimientos almacenados si lo hace a través de EF. Puede consultar los detalles de los roles aquí .

Jeff Ogata
fuente
8
gracias, hice lo que triste, ahora recibo este error: No se puede abrir la base de datos "SiteNameExtension" solicitada por el inicio de sesión. El inicio de sesión falló. Error de inicio de sesión para el usuario 'IIS APPPOOL \ DefaultAppPool'.
GibboK
76
MUY IMPORTANTE: ¡NO HAGA CLIC EN BÚSQUEDA PARA INTENTAR CONFIRMAR EL INICIO DE SESIÓN! No lo reconocerá pero funcionará. Simplemente escríbalo como IIS APPPOOL \ SimonsAppPoolName. Vea este stackoverflow.com/questions/1933134
Simon_Weaver
66
En cambio, es mejor cambiar 'Identidad' a 'LocalSystem' desde IIS, como se describe en la siguiente respuesta.
Altaf Patel
¿Puede funcionar esto cuando la instancia de su servidor SQL está en otra máquina host que su máquina host IIS? Porque necesito solucionar el mismo problema, pero SQL e IIS no están en la misma máquina. Por lo tanto, usar la autenticación de Windows para ese nuevo usuario no funcionará
Segers-Ian
55
Para mí, el usuario que agregó fue 'IIS APPPOOL \ DefaultAppPool'. Entonces funcionó.
Marcel
343

Puede cambiar ApplicationPoolIdentity de IIS7 -> Grupos de aplicaciones -> Configuración avanzada. Ajustes avanzados

En ApplicationPoolIdentity encontrará el sistema local. Esto hará que su aplicación se ejecute NT AUTHORITY\SYSTEM, que es un inicio de sesión existente para la base de datos de forma predeterminada.

Editar: antes de aplicar esta sugerencia, debe tener en cuenta y comprender las implicaciones de seguridad.

La A
fuente
51
@GibboK, si le preocupa la seguridad, no haga esto. Ver technet.microsoft.com/en-us/library/dd378907(v=WS.10).aspx
Jeff Ogata el
44
Además de ejecutar el grupo de aplicaciones como la identidad LocalSystem, también tuve que asignar el usuario "NT AUTHORITY \ SYSTEM" a los roles de la base de datos
Phil
31
Esto apesta. Otorgar la autoridad del SISTEMA a una aplicación web es una receta para el desastre y permite a los delincuentes todo tipo de oportunidades para infligir daños no solo a su aplicación web, sino a todo el servidor de alojamiento. El hecho de que la base de datos acepte inicios de sesión de SYSTEM no significa que deba ejecutar su aplicación web como SYSTEM. El escritorio de Windows ni siquiera te permitirá correr como SYSTEM (sin saltar por los aros). Ejecutar una aplicación web con esta autoridad es una idea muy, muy estúpida. Debe hacer que la base de datos acepte la identidad actual del grupo de aplicaciones. Tendría -100 si pudiera. -1.
gastador
8
SYSTEM tiene más privilegios que el administrador. NUNCA debe ejecutar su servidor web con algo que se acerque a ese nivel.
slugster
1
Acabo de hacer que la cuenta de Invitado sea miembro del grupo del Administrador. Simple, limpio, nunca tenga problemas con la mierda de seguridad.
29

asegúrese de tener ...

Trusted_Connection=false;

en tu conexión String

JGilmartin
fuente
77
Tener Trusted_Connection = true en la cadena de conexión anulará los valores de autenticación de SQL con el perfil de usuario de Identidad IIS.
Jeff the Bear
2
en mi caso eliminar: Integrated Security = True de la cadena de conexión lo arregló.
Carlos R Balebona
Trabajó para mi. Salvó el día @JefftheBear
D_Edet
26

Resolví este problema usando sql como la siguiente imagen.

Haga clic derecho en db-> propiedades -> permiso -> Ver permiso del servidor -> y luego seleccione IIS APPPOOL\ASP.NET v4.0y otorgue permiso.

db

DevT
fuente
¿El proceso anterior (y la imagen) que está describiendo otorga permisos de nivel de servidor a esa identidad de grupo de aplicaciones? No suena como una buena idea.
Chris Walsh
2
¡Este usuario merece la medalla! ¡Nada ayudó más que esto!
Khateeb321
2
@ Khateeb321 absolutamente, muchas gracias DevT por tu respuesta.
Azxdreuwa
22

Ejecute este script sql

IF NOT EXISTS (SELECT name FROM sys.server_principals WHERE name = 'IIS APPPOOL\DefaultAppPool')
BEGIN
    CREATE LOGIN [IIS APPPOOL\DefaultAppPool] 
      FROM WINDOWS WITH DEFAULT_DATABASE=[master], 
      DEFAULT_LANGUAGE=[us_english]
END
GO
CREATE USER [WebDatabaseUser] 
  FOR LOGIN [IIS APPPOOL\DefaultAppPool]
GO
EXEC sp_addrolemember 'db_owner', 'WebDatabaseUser'
GO
Rolwin Crasta
fuente
Gracias, la forma más fácil;) +1
Zolfaghari
11

Si en la cadena de conexión ha especificado:

User ID=xxx;Password=yyy

pero en la cadena de conexión hay:

Trusted_Connection=true;

SQL Server usará la autenticación de Windows, por lo que sus valores de conexión serán ignorados y anulados (IIS usará la cuenta de Windows especificada en el perfil de usuario de Identity). Más información aquí

Lo mismo se aplica si en la cadena de conexión hay:

 Integrated Security = true;

o

 Integrated Security = SSPI;

porque la autenticación de Windows se usará para conectarse al servidor de la base de datos. Más información aquí

hombre araña
fuente
10

vaya a iis -> grupos de aplicaciones -> encuentre el grupo de aplicaciones utilizado en la aplicación

ingrese la descripción de la imagen aquí

seleccione el grupo de aplicaciones utilizado para la aplicación haga clic con el botón derecho seleccione configuración avanzada

ingrese la descripción de la imagen aquí

Seleccionar identidad del grupo de aplicaciones ingrese la descripción de la imagen aquí

seleccione integrado como Sistema local y haga clic en Aceptar

Lijo
fuente
7

Odio la ApplicationPoolIdentity. Siempre configuro una cuenta de usuario de Windows como la cuenta en AppPools.

Como dice a la deriva, suena como un problema de seguridad de la base de datos. Por lo tanto, cree una cuenta de usuario NT, asígnela al grupo de aplicaciones ASP.NET v4.0 y luego otórguele permiso en la carpeta del sitio web y en las tablas relevantes en SQL.

cristiano
fuente
lo siento, no tengo idea de cómo hacerlo, ¿podrías señalarme un tutorial? gracias por su ayuda en esto
GibboK
2
No haga esto, hay una razón por la que IIS cambió la identidad del grupo de aplicaciones, learn.iis.net/page.aspx/624/application-pool-identities
Julien Lebot el
@ LeSnip3R enlace roto
Adaptabi
6

No use la seguridad integrada. UtilizarUser Id=yourUser; pwd=yourPwd;

Esto resuelve el problema.

bonh
fuente
4

Tuve este problema y en realidad fue causado por algo diferente: tenía el usuario 'IIS APPPOOL \ ASP.NET v4.0' en mi base de datos pero aún no funcionaba.

Recientemente actualicé mi instalación de SQL Server y, en el proceso, el usuario se desconectó del inicio de sesión, por lo que hubo un 'IIS APPPOOL \ ASP.NET v4.0' en Base de datos -> Seguridad -> Usuarios, pero ningún usuario no está en seguridad -> Inicios de sesión.

Se agregó el inicio de sesión 'IIS APPPOOL \ ASP.NET v4.0' a Seguridad -> Inicios de sesión, SQL Server lo asignó automáticamente al Usuario en la base de datos (esto solía hacerse manualmente) y se solucionó el problema.

El codificador
fuente
1
solo para agregar ... en el lado izquierdo, en Permisos ... marque db_writer y db_reader; y seleccione la base de datos que utilizará esos permisos.
benjieb
4

Lo primero que debe borrar si está utilizando la autenticación de Windows y no está mencionando ninguna contraseña de nombre de usuario en su cadena de conexión:

Qué sucede cuando ejecuta su código a través de localhost: cuando ejecuta su cliente de prueba wcf desde localhost, podrá comunicarse con la base de datos cuando la aplicación del modo de depuración local llame a la base de datos por el servicio de su cuenta. Por lo tanto, tiene acceso a la base de datos porque devenv.exe se ejecuta en su cuenta de usuario.

Pero cuando implementa su servicio web en IIS. Ahora entienda que este servicio se ejecuta bajo IIS, no bajo su cuenta. Por lo tanto, debe asignar derechos de acceso al servicio IIS para acceder al servidor SQL para la autenticación de Windows. Aquí su servicio web no podrá comunicarse con el servidor SQL debido a un problema de derechos de acceso y Error de inicio de sesión para el usuario_______ (aquí vendrá su usuario)

Entonces, si está utilizando la autenticación de Windows para conectar su base de datos, solo tiene que cambiar la configuración del grupo de aplicaciones IIS. Debe cambiar la identidad del grupo de aplicaciones IIS al sistema local.

A continuación se detallan los Pasos para la autenticación de Windows WCF:

1) Abra IIS (windows + R (ejecutar) luego escriba inetmgr, luego haga clic en Aceptar)

2) haga doble clic en el nombre de su PC en Conexiones

3) Haga clic en Grupos de aplicaciones

4) Seleccione su grupo de aplicaciones (DefaultAppPool)

5) Luego, bajo acciones a la derecha, haga clic en Configuración avanzada:

6) Vaya a la sección Modelo de proceso y

7) haga clic en Identidad.

8) Ahora seleccione LocalSystem.

Ahora abra su estudio de administración de servidores sql: abra run-> luego escriba ssms -> luego presione ok En ssms, inicie sesión con su cuenta de autenticación de Windows. Abra la pestaña de seguridad, expanda la pestaña de inicios de sesión y luego podrá ver su cuenta.

Ahora abra las propiedades de su cuenta, vaya a userMapping, luego seleccione la base de datos que desea conectar y luego verifique los servicios de membresía de roles que desea usar para la base de datos seleccionada. haga clic en Aceptar.

(Para los servicios de red, es decir, los usuarios de la intranet, también debe configurar los ajustes anteriores para NT AUTHORITY \ SYSTEM user)

agregar Trusted_Connection = True; propiedad en su cadena de conexión. Guárdelo e implemente el servicio web. Reinicie el grupo de aplicaciones.

Ahora podrá conectar la base de datos.

Amar Gadekar
fuente
¡Perfecto! LocalSystem solucionó este problema para mí :)
totalitario
3

Recibí este mensaje y uso la autenticación de Windows en el servidor web.

Quería que el usuario web actualmente autenticado se autenticara en la base de datos, en lugar de usar el usuario IIS APPPOOL \ ASP.NET v4 especificado en el grupo de aplicaciones.

Encontré lo siguiente en web.config lo arregló para mí:

<system.web>
  <identity impersonate="true" />
</system.web>

https://msdn.microsoft.com/en-us/library/bsz5788z.aspx

Veo otras respuestas con respecto a la creación del nombre de usuario de AppPool en la base de datos SQL o simplemente para usar la autenticación de SQL. Ambos serían correctos si no quisiera capturar o proteger a los usuarios individuales de Windows dentro de SQL.

Tom

tommylux
fuente
Esto lo resolvió para nosotros y no estamos seguros de por qué. ¿IIS / AppPool solo secuestra la cadena de conexiones que dice explícitamente "Integrated Security = true"? ¿¿Por qué??
Chico
3

1_in SqlServer Security => Login => NT AUTHORITY \ SYSTEM => RightClick => Property => UserMaping => Select YourDatabse => Public && Owner Select => OK 2_In IIs Pool de aplicaciones DefaultAppPool => Configuración avanzada => Identity => LocalSystem => Ok

mehranSattary
fuente
2

Establecer la identidad solo hace que esto funcione en mis páginas.

Charles
fuente
2

Cassini ejecuta su sitio web como su propia identidad de usuario cuando inicia la aplicación Visual Studio. IIS ejecuta su sitio web como una identidad de grupo de aplicaciones. A menos que la identidad del grupo de aplicaciones tenga acceso a la base de datos, obtendrá errores.

IIS presentó App Pool Identity para mejorar la seguridad. Puede ejecutar sitios web con la identidad predeterminada del grupo de aplicaciones, o crear un nuevo grupo de aplicaciones con su propio nombre, o crear un nuevo grupo de aplicaciones con su propio nombre que se ejecute bajo una cuenta de usuario (generalmente cuenta de dominio).

En situaciones de red (que no están en Azure) puede hacer que se ejecute un nuevo grupo de aplicaciones con una cuenta de usuario de dominio de Active Directory; Prefiero esto sobre la cuenta de la máquina. Hacerlo brinda seguridad granular y acceso granular a los recursos de la red, incluidas las bases de datos. Cada sitio web se ejecuta en un grupo de aplicaciones diferente (y cada uno de ellos se ejecuta bajo su propia cuenta de usuario de dominio).

Continúe usando Windows Integrated Security en todas las cadenas de conexión. En SQL Server, agregue los usuarios de Dominio como inicios de sesión y otorgue permisos a bases de datos, tablas, SP, etc. por sitio web. Por ejemplo, DB1 utilizado por el sitio web1 tiene un inicio de sesión para el usuario1 porque el sitio web1 se ejecuta en un grupo de aplicaciones como usuario1.

Un desafío con la implementación desde la base de datos incorporada de Visual Studio (por ejemplo, LocalDB) y el servidor web incorporado en un entorno de producción deriva del hecho de que el SID de usuario del desarrollador y sus ACL no deben usarse en un entorno de producción seguro. Microsoft proporciona herramientas para la implementación. Pero lástima el pobre desarrollador que está acostumbrado a todo lo que está funcionando de inmediato en el nuevo VS IDE fácil con localDB y localWebServer, porque estas herramientas serán difíciles de usar para ese desarrollador, especialmente para un desarrollador que carece de soporte SysAdmin y DBAdmin o sus conocimientos especializados No obstante, la implementación en Azure es más fácil que la situación de la red empresarial mencionada anteriormente.

subsci
fuente
2

Si tiene su cadena de conexión agregada en su web.config, asegúrese de que "Integrated Security = false;" entonces usaría la identificación y la contraseña especificadas en web.config.

<connectionStrings>
    <add providerName="System.Data.SqlClient" name="MyDbContext" connectionString="Data Source=localhost,1433;Initial Catalog=MyDatabase;user id=MyUserName;Password=MyPassword;Trusted_Connection=true;Integrated Security=false;" />
</connectionStrings>
Daming Fu
fuente
2

Como se señaló, no use la autenticación de Windows, use la autenticación de SQL Server

Además, si creó una conexión utilizando el cuadro de diálogo "Conexión del servidor", asegúrese de verificar las conexiones en web.config. Es probable que haya creado / modificado la conexión y se haya almacenado como conexión de confianza en web.config. Simplemente use esta autenticación

<add name="MyDBConnectionString" connectionString="Data Source=localhost;Initial Catalog=Finantial;User ID=xxx;Password=xxx" providerName="System.Data.SqlClient"/>

que debería arreglar el error.

Hammad Khan
fuente
2

Otra forma de otorgar permiso a la base de datos para el usuario IIS APPPOOL\ASP.NET v4.0es la siguiente.
ingrese la descripción de la imagen aquí


  1. Agregue un nuevo usuario con nombre de usuario y nombre de inicio de sesión como IIS APPPOOL\ASP.NET v4.0con su esquema predeterminado.
  2. Vaya a Esquema de propietario y Membresía, Verifique db_datareader, db_datawriter
shana
fuente
1

Pensé en publicar esto como una respuesta, ya que es relevante para la pregunta y puede responderla en algunos casos.

Ese mismo mensaje aparece también si la base de datos no existe!

Asegúrese de que su cadena de conexión no tenga errores ortográficos, esté apuntando a la instancia correcta del servidor, etc.

colmde
fuente
1

Tengo el mismo problema que lo resolví cambiando Integrated Security=Truea falso ahora funciona

subramanya46
fuente
1

me sucedió algo similar, lo que funcionó para mí fue cambiar la propiedad Seguridad integrada = Verdadero a Seguridad integrada = falso en la configuración web del sitio web

Erik Rodriguez
fuente
¡esto funciona! Acabo de quitar la seguridad integrada
Charles Xavier
0

¿Has hecho lo @Teddyrecomendado y TODAVÍA obtienes el mismo error?

Asegúrese de cambiar la configuración del grupo de aplicaciones que corresponde a su directorio virtual y no al servidor principal. Cada directorio virtual tiene su propio AppPool y no hereda.

Simon_Weaver
fuente
0

En DefaultAppPool, configure NetworkService en la propiedad Identity y en Sql Server agregue User Network Service y dele los permisos adecuados a su base de datos, eso funciona muy bien para mí, lo he probado localmente pero creo que esta es la mejor configuración para conectarse desde cualquier otra computadora en la red. cuando configura LocalSystem en Identity en IIS, eso funciona bien y no es necesario crear ningún otro usuario en SQL Server, pero creo que eso no funcionará en un entorno de red.

Luis
fuente
0

Me encontré con el mismo problema al probar la API web ASP.NET

Desarrollado Web.Host en Visual Studio 2013 Express Base de datos creada en SQL Server 2012 Express Ejecución de prueba usando IIS Express integrado (funcionando) Modificado para usar IIS Local (desde la página de propiedades - opción web) Prueba de rangos con Fiddler Error recibido - no se puede abrir la base de datos para el proveedor ... citando 'APPPOOL \ DefaultAppPool'

Solución que funcionó.

En IIS

Haga clic en el grupo de aplicaciones 'DefaultAppPool' Establecer Identificar = 'ApplicationPoolIdentity' Establecer .NET framework = v4.0 (aunque mi aplicación era 4.5)

En SQL Server Management Studio

Haga clic con el botón derecho en la carpeta Seguridad (en el motor de SQL Server, por lo que se aplica a todas las tablas). Haga clic con el botón derecho en Usuario y agregue 'IIS APPPOOL \ DefaultAppPool'. Con respecto a lo anterior, si usted es un DBA, probablemente conozca y quiera controlar cuáles son esas opciones. Si usted es como yo, un desarrollador solo quería probar su servicio de API WEB, que también tiene acceso a SQL Server a través de EF 6 en estilo MVC, simplemente marque todo. :) Sí, lo sé pero funcionó.

Brian Quinn
fuente
0

En caso de que agregue un nuevo inicio de sesión, asegúrese de que en las propiedades del servidor (clic derecho -> propiedades) / seguridad, el modo de autenticación esté configurado tanto para sqlserver como para windows, no solo windows.

Badr Slaoui
fuente
0

Agregue "Todos" bajo seguridad. Si agregó el Servidor y los usuarios que inician sesión en la base de datos, esto es algo que le falta. Espero que esto ayude.

avinava basu
fuente
Establecemos permisos de acuerdo con nuestras necesidades. La parte de autenticación se maneja y verificamos la autorización a través del código para permitir el acceso. Siéntase libre de corregirme si siente que hay alguna ambigüedad. Gracias.
avinava basu
0

Para el registro, si encuentra este error después de cambiar de LocalDBa SQLEXPRESS, asegúrese de que la base de datos ya esté enSQLEXPRESS . Puede verificar esto en Management Studio.

Tuve el mismo problema al usar Entity Frameworkdespués de cambiar a SQLEXPRESS from LocalDB. Tuve que ejecutar el Update-Databasecomando. Pude conectarme con éxito después de eso.

Irshu
fuente
0

Hice exactamente lo que dijo @JeffOgata pero recibí el error:

Windows NT user or group 'IIS APPPOOL\ASP.NET v4.0' not found. Check the name again. (Microsoft SQL Server, Error: 15401)

Miré mi mensaje de error nuevamente y decía Login failed for user 'IIS APPPOOL\DefaultAppPool'.

Después de agregar un usuario llamado IIS APPPOOL\DefaultAppPooltodo funcionó.

Ogglas
fuente
0

Usé SQL Server Profiler (disponible en SSMS => menú Herramientas) y vi (cuando IIS intentó conectarse a la base de datos) que mi usuario de IIS era por alguna razón NT AUTHORITY \ IUSR, sin importar todos los pasos recomendados en las respuestas de esta pregunta . Así que agregué ese usuario a SQL Server, y funcionó ...

alexkovelsky
fuente
0

En el formulario web Asp.net,

Este error se solucionó al instalar asp.net desde:

El Administrador del servidor> Administrar> Agregar función y función> Funciones del servidor> Servidor web (IIS)> Servidor web> Desarrollo de aplicaciones> ASP.NET 3.5 / 4.6 está instalado.

mi problema solucionado

Zolfaghari
fuente