2009-05-18 28 views
9


SqlException: Error de usuario 'NT AUTHORITY NETWORK

Cuando ejecuto la aplicación web a través de VS 2008, la aplicación es capaz de iniciar una sesión en el servidor SQL y comprobar las credenciales (nombre de usuario y contraseña) introducidos por el usuario, pero cuando navego a esta aplicación a través de IIS 7 e intento devolver el nombre de usuario y la contraseña, la aplicación informa una excepción:

System.Data.SqlClient.SqlException: error de inicio de sesión para el usuario 'NT AUTHORITY \ NETWORK SERVICE '

  • Con IIS 7, cada proceso se ejecuta en Servicio de red cuenta ... ¿qué derechos debo asignar a esta cuenta para que la aplicación pueda "contactar" al servidor Sql?


Gracias


EDIT:

Hola,


Funciona ahora, aunque no entiendo por qué la cuenta de máquina necesitaba esos derechos. Entiendo que la cuenta de máquina necesita algunos derechos para poder "hablar" con un programa específico (servidor Sql), pero ¿por qué necesita derechos para acceder a la base de datos y sus tablas? no está en manos de la cuenta especificada en la cadena de conexión

<add name="MyConnection" connectionString="data source=localhost; integrated security=sspi; initial catalog=aspnetdb;" /> 

que tienen derechos de acceso a la base de datos y sus tablas?

+2

OrigenC, la cadena de conexión no está utilizando una combinación específica de usuario/contraseña, por lo tanto, se está utilizando seguridad integrada de Windows. Al usar Integrated Security en la cadena de conexión, la aplicación se conecta a la base de datos mediante la cuenta en la que se ejecuta el grupo de aplicaciones de la aplicación web. Si desea utilizar la identidad de la persona que llama, entonces necesita leer sobre la suplantación de ASP.NET. No lo recomiendo, aunque hay varias desventajas de utilizar este enfoque. Es posible que desee utilizar una combinación de nombre de usuario y contraseña en la cadena de conexión en lugar de sus requisitos. – RichardOD

Respuesta

19

Deberá crear realmente una cuenta en SQL Server para la cuenta de servicio de red. Luego, le otorgará acceso a su base de datos; los permisos específicos que otorgue a la cuenta dependen de la naturaleza de las tareas que su base de datos necesita hacer.

Puede hacerlo todo en SSMS a través de la sección "Seguridad", haga clic derecho en "Inicios de sesión" y seleccione agregar. Agregará una cuenta de Windows, luego podrá buscar y validar el nombre "SERVICIO DE RED". Luego, cambie a la sección "Asignación de usuarios" y conceda permiso para ver su base de datos. Los permisos que he indicado dependen de usted, o puede asignarle permisos de dbowner para un control total.

Después de hacer eso, estarás bien. ¡Advierto en contra de dar a la aplicación más permisos de los necesarios!

+0

gracias, esto me ayudó mucho. :) –

3

Recomiendo crear una cuenta de servicio y ejecutar su proceso de IIS 7 como esa cuenta. Asegúrese de que la cuenta tenga acceso adecuado a la base de datos (si solo lee DB-REader) (si lee y actualiza, entonces DB-Reader y DB-Writer).

9

Personalmente, ejecutaba la aplicación web en una cuenta de servicio personalizada. Si realmente desea ejecutarlo en Servicio de red: see this MSDN document.

8

Como especificas "security = sspi integrado" en la cadena de conexión de lo que supongo que esperas suplantar. Pero para esto debe: 1. activar autenticación integrada en IIS 2.activar ventanas de autenticación en asp.net: 3. Encienda imerposation en asp.net:

Ten en cuenta también que no es suficiente si el servidor web y la máquina de SQL Server se diferentes máquinas. Entonces se requerirá que la cuenta de sus usuarios sea confiable para la delegación. Es una opción especial en AD.

Por lo tanto, ya se ha dicho que es mejor tener una cuenta separada para las conexiones SQLSRV. Espero que esto ayude.

+0

Entonces, cuando me conecto al servidor Sql (como usuario U) a través del estudio de administración de servidor Sql, el estudio de administración del servidor (u otro servicio) asume la identidad del usuario U? Si es así, supongo que el servidor Sql no solo exige que el proceso P1 (que intenta "hablar" con este servidor Sql) proporcione las credenciales apropiadas (nombre de usuario U1 y contraseña), sino que también exija que ese P1 también se ejecute como usuario U1? Pero entonces, ¿por qué el servidor Sql incluso exige a P1 que proporcione las credenciales apropiadas? ¿Por qué no solo comprueba si P1 se ejecuta como U1, y si es así, deja que P1 "in"? – SourceC

+0

Disculpe, pero asegúrese de entender qué son la suplantación y la delegación. Verifique esto: http://msdn.microsoft.com/en-us/library/ms998351.aspx http://www.infosysblogs.com/microsoft/2009/02/impersonation_and_delegation_t.html – Shrike

2

Encontré el mismo error con una nueva configuración de IIS. Utilicé "security = false integrado; User Id = sa; Password = yourpassword" y todo funcionó bien.

+0

El usuario sa debe estar reservado para tareas administrativas – GnomeCubed

1

Este error ocurre cuando ha configurado su aplicación con IIS, e IIS va a SQL Server e intenta iniciar sesión con credenciales que no tienen los permisos adecuados. Este error también puede ocurrir cuando se configura la duplicación o duplicación.

Voy a revisar una solución que funciona siempre y es muy simple.

Ir a SQL Server >> Seguridad >> inicios de sesión y haga clic derecho en NT AUTHORITY \ Servicio de red y seleccione Propiedades

En la pantalla de reciente apertura de Iniciar sesión Propiedades, vaya a la pestaña “Asignación de usuarios”. Luego, en la pestaña "User Mapping", seleccione la base de datos deseada, especialmente la base de datos para la cual se muestra este mensaje de error. En la pantalla inferior, compruebe el rol db_owner. Haga clic en Aceptar.

0

Encontré este problema en un proyecto de SharePoint. La seguridad integrada estaba activada y la base de datos ya estaba configurada para permitir el acceso del usuario del conjunto de aplicaciones.

El problema era que la suplantación se convirtió en en cuando tenía que estar apagado. This answer me llevó en la dirección correcta:

WindowsImpersonationContext noImpersonateContext = null; 

try 
{ 
    noImpersonateContext = WindowsIdentity.Impersonate(IntPtr.Zero); 
    using (SqlConnection conn = CreateConnection()) 
    { 
     // database calls... 
    } 
} 
finally 
{ 
    if (noImpersonateContext != null) noImpersonateContext.Undo(); 
} 
Cuestiones relacionadas