Error de permiso de usuario al acceder a la base de datos de "instancia de usuario" desde ASP.NET
sql sql-server (9)
Seguridad integrada = Verdadero
¿Los inicios de sesión del usuario en la base de datos están conectados a las cuentas de usuario en la máquina? ¿Podría ser que hay algún problema de mapeo alrededor de eso?
El servidor que aloja csharpindepth.com se ha migrado recientemente.
La mayoría funciona bien, pero no puedo acceder a la base de datos utilizada para guardar erratas, notas, etc.
Detalles relevantes:
- Windows Server 2003 de 32 bits
- SQL Server Express 2005 instalado
- Grupo ASP.NET que se ejecuta bajo la cuenta de "SERVICIO DE RED"
- .NET 3.5
- Todos tienen permiso completo para los archivos de la base de datos (en este momento, ¡solo para descartar eso!)
Cadena de conexión:
Data Source=.;AttachDbFilename=|DataDirectory|/WebSiteData.mdf; Integrated Security=True;User Instance=True
Me estoy conectando solo creando un nuevo
WebSiteDataContext
(que tiene la cadena de conexión anterior como su predeterminado)
Utilizando una aplicación de consola de prueba pequeña que se ejecuta desde el directorio que contiene los archivos, como la cuenta del administrador, utilizando la misma consulta, puedo ver el contenido de la base de datos.
En ASP.NET estoy recibiendo esta excepción:
SqlException (0x80131904): User does not have permission to perform this action.
EDITAR: Más información, aquí está el seguimiento de la pila:
[SqlException (0x80131904): User does not have permission to perform this action.]
System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) +4844759
System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) +194
System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +2392
System.Data.SqlClient.SqlInternalConnectionTds.CompleteLogin(Boolean enlistOK) +35
System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, Boolean ignoreSniOpenTimeout, Int64 timerExpire, SqlConnection owningObject) +144
System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(String host, String newPassword, Boolean redirectedUserInstance, SqlConnection owningObject, SqlConnectionString connectionOptions, Int64 timerStart) +342
System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(SqlConnection owningObject, SqlConnectionString connectionOptions, String newPassword, Boolean redirectedUserInstance) +221
System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, Object providerInfo, String newPassword, SqlConnection owningObject, Boolean redirectedUserInstance) +189
System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection) +4859187
System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options) +31
System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject) +433
System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject) +66
System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject) +499
System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) +65
System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) +117
System.Data.SqlClient.SqlConnection.Open() +122
System.Data.Linq.SqlClient.SqlConnectionManager.UseConnection(IConnectionUser user) +44
System.Data.Linq.SqlClient.SqlProvider.get_IsSqlCe() +45
System.Data.Linq.SqlClient.SqlProvider.InitializeProviderMode() +20
System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query) +57
System.Data.Linq.DataQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() +35
EDITAR: Me equivoqué sobre el hecho de que el nombre de archivo tenga que ser correcto: cambiar la cadena de conexión para hacerlo hablar a un archivo diferente no cambia el error.
ProcMon nunca lo muestra tocando el archivo ...
EDITAR: Más rarezas: reiniciar el grupo de aplicaciones ejecutándose bajo la cuenta del sistema local aún tiene problemas, lo cual es tan extraño como parece. Es como si, a pesar del mensaje de error, en realidad se trate de hacer algo imposible (por ejemplo, con la ruta incorrecta) en lugar de ser un problema de permisos.
EDITAR: Más información: acabo de ejecutar mi pequeña aplicación de consola de prueba desde un servicio como "SERVICIO DE RED" y (después de un primer intento que finalizó el tiempo de espera) se realizó correctamente. Entonces, no es una cuestión de permisos en términos de la cuenta de usuario ... es algo sobre el entorno en el que se ejecuta ...
¿Ha intentado ejecutar aspnet_regsql.exe en el servidor para potencialmente poner algo en su lugar (como si tuviera que ejecutar aspnet_regiis una vez en la luna azul)? Scott Gu tiene una descripción básica de todo el proceso que se encuentra here .
¿Has hecho esto?
Para configurar SQL Server para la seguridad integrada de Windows.
Desde el menú Inicio de Windows, seleccione Microsoft SQL Server y luego seleccione Administrador corporativo.
Abra el nodo para el servidor y expanda el nodo para la base de datos para la que desea otorgar permisos a los usuarios.
Haga clic derecho en el nodo Usuarios y seleccione Nuevo usuario de base de datos.
En el cuadro de diálogo Propiedades del usuario de la base de datos, ingrese dominio / nombre de usuario en el cuadro Nombre de inicio de sesión y luego haga clic en Aceptar. Además, configure el SQL Server para permitir que todos los usuarios del dominio accedan a la base de datos.
Básicamente, verifique que tenga "NT AUTHORITY / NETWORK SERVICE" listado allí.
También al menos en SQL 2008, no estoy seguro acerca de 2005, también lo configuraría a nivel de servidor (Servidor -> Seguridad -> Inicios de sesión).
¿La instancia del niño incluso comienza? Cuando se solicita una base de datos RANU, la instancia maestra (. / SQLEXPRESS en este caso) debe crear una instancia ''secundaria'', es decir, iniciar el proceso sqlservr.exe como un proceso de usuario que se ejecuta bajo las credenciales del usuario que solicitó el RANU. Conexión desde la instancia .SQLEXPRESS. En este caso, la instancia debería iniciarse como ''SERVICIO DE RED''.
Para validar si la instancia secundaria se inicia, conéctese a la instancia maestra (. / SQLEXPRESS) y verifique sys.dm_os_child_instances :
SELECT *
FROM sys.dm_os_child_instances
Si se inicia una instancia secundaria propiedad de NETWORK SERVICE, tome su instance_pipe_name
y conéctese directamente a la instancia secundaria:
sqlcmd -S np://./pipe/<child pipe name>/tsql/query
Lo ideal es conectarse como SERVICIO DE RED (por ejemplo, desde una consola cmd interactiva iniciada como SERVICIO NEWTORK, quizás utilizando at.exe para programarlo 1 minuto en el futuro). Si eso funciona, el último paso es intentar adjuntar el MDF utilizando ordinarry sp_attach_db.
La idea de estos pasos no es resolver el problema, sino identificar la causa del error, ya que el error que se obtiene es algo genérico y ... no es exactamente útil.
Cuando dice que los usuarios tienen permisos completos para el archivo, ¿todos los usuarios tienen permisos completos en el directorio app_data? Sql necesitará crear un archivo de bloqueo junto con el archivo MDF.
¿También está seguro de que la instancia de SQL Express tiene instancias de usuario habilitadas?
Dado que tiene Autenticación de confianza = Verdadero, la conexión utiliza el contexto de seguridad del proceso de llamada. Eso significa que está ejecutando el servidor de desarrollo en el contexto de seguridad del usuario que ha iniciado sesión, por lo que todo funciona bien. Cuando se ejecuta en IIS, se encuentra en el contexto de seguridad del proceso del grupo de aplicaciones, que es el SERVICIO DE RED, que no tiene un perfil de usuario, por lo tanto, se bloquea.
Para arreglarlo, usa la solución # 1 o # 2.
1.) Cambie la identidad del grupo de aplicaciones a un usuario normal con acceso a la base de datos, como una cuenta personalizada. SUGERENCIA: configura este usuario: SELECT owning_principal_name FROM sys.dm_os_child_instances WHERE heart_beat = ''alive''
2.) Use una cadena de conexión con nombre de usuario y contraseña; es decir, usar la autenticación de SQL Server, no la autenticación de confianza = Verdadero.
Esta pregunta aparece relacionada con: "No se puede abrir la base de datos predeterminada del usuario. Error de inicio de sesión". después de instalar SQL Server Management Studio Express
Al parecer, la instancia de usuario y SQL Server Express tiene algunos problemas interesantes. Tal vez quiera echar un vistazo a http://blogs.msdn.com/b/sqlexpress/archive/2006/11/22/connecting-to-sql-express-user-instances-in-management-studio.aspx . Esto parece hacer el truco para la mayoría de los que tienen este problema.
Lo primero que haría sería disparar a filemon (o mejor Monitor de proceso) para ver si el proceso de IIS puede abrir el archivo de la base de datos, me parece un problema de seguridad.
También: asegúrese de que la carpeta ~ / App_Data no sea de solo lectura. Además, verifique si ha otorgado permisos completos a la cuenta del "Servicio de red" para la misma carpeta.
Es posible que desee ejecutar IISRESET para reiniciar IIS y también para actualizar sus permisos.
Si está utilizando la creación de instancias de usuario, se está conectando como administrador de todos modos, lo que por cierto no es recomendable para escenarios de alojamiento. Los problemas de perms que tiendo a encontrar son los físicos en los archivos en sí, no en las carpetas: la base de datos separada tiene una tendencia a eliminar los perms.
Podría ayudar si puede reducir exactamente dónde está ocurriendo la excepción. ¿Qué acción está tratando de realizar? Base de datos abierta, leer, escribir? También intente con otra base de datos (es decir, es esa base de datos en particular) y pruebe con una versión sin instancia del usuario; adjuntar la base de datos a una instancia.