Buscar este blog: escribe aquí

lunes, 5 de mayo de 2008

Web.Error - SQL Server does not exist or access denied.

Se puede dar el error mencionado al querer acceder a una base de datos SQL Server desde una aplicación Web .NET con ADO.NET como método de conexión. Generalmente este problema se da al ejecutar una aplicación Web, no con las aplicaciones Win. Además se da al querer ejecutar la aplicación Web, no con la reorganización, porque aunque la aplicación sea Web, la reorganización es una aplicación Win.


Si se está en las condiciones antes mencionadas, a continuación se mencionan varios puntos para verificar, y algunas soluciones.

**** En las DBMS Options de GX: ****
- En la propiedad Server Name usar la IP en lugar de usar el nombre del servidor.
- Chequear que el nombre de la base de datos haya quedado correctamente escrito en Database Name
- En el archivo web.config agregar el impersonate y configurar el usuario de red junto con el dominio, esto es, dentro de la sección <system.web> del web.config agregar la siguiente línea:
<identity impersonate="true" username="dominio\usuario" password="password"/>

- Si el SQL Server está en distinta máquina que el servidor Web, entonces se puede verificar esto: http://support.microsoft.com/default.aspx?scid=kb;en-us;Q315159
Entonces para eso, se puede cambiar el web.config de la siguiente manera:
Cambiar la línea
<add key="Connection-Default-Opts" value=";Integrated Security=no;" /> por
<add key="Connection-Default-Opts" value=";Integrated Security=no;Network Library =dbmssocn" />

Esto hace que se comunique via TCP/IP con la BD. Aunque se puede configurar desde la opción SQL Server / Client Network Utility / Alias agregándolo en el web.config también tendría que funcionar.

**** En el Enterprise Manager, donde está dada de alta la instancia del servidor SQL Server remoto, verificar los siguientes puntos: ****
- Botón derecho sobre el nombre de la instancia / Properties / Security / Ver si en Authentication está seleccionado: SQL Server and Windows
- Por defecto si no se especifica nada en las "Additional connection string attributes" intenta conectarse al puerto 1433, ver si está configurado ese puerto, Properties de la instancia / General / Network configuration / Marcar TCP/IP y dentro de los Enabled protocols / Properties debe decir 1433
- La instancia debe tener el mismo nombre que la máquina donde está el SQL Server, es decir la instancia que se ve en el Enterprise Manager no puede tener distinto nombre que la máquina remota donde está instalado el SQL Server.

Si se está haciendo una conexión a un SQL Server pero a otro puerto que no sea el default de SQL Server (1433) se debe especificar en las DBMS OPTIONS en la propiedad "Server Name": SERVER,PORT y en la propiedad:
"Additional connection string attributes" no se debe especificar nada.

Puede ser que haya un firewall y no se tenga el puerto definido en la instancia habilitado, para saber esto se puede hacer un telnet al servidor indicando el puerto, por ejemplo desde una ventana de comandos ejecutar:
telnet <nombre de servidor> 1433
si no da ningún mensaje se accede bien al servidor, si se da un error es porque no está habilitado el puerto 1433, en ese caso hay que habilitarlo.

Hay más puntos para verificar en: http://support.microsoft.com/?id=328306

**** Para chequear que la instancia del SQL Server está correcta, se pueden ejecutar las siguientes sentencias desde el Query Analizer (esto puede estar mal si se renombró en algún momento la instancia del SQL Server): ****
1 - Check sp_helperserver at SQL Query Analyzer: it should return one row with id =0 and name= instance name. Check 'select @@servername' at SQL Query Analyzer: if it returns the same instance name, go to step B; otherwise:
2 - drop the wrong instance name and add the correct name:
a - sp_dropserver 'old_name', 'droplogins'
b - go
c - sp_addserver 'new_name', 'local'
d - go
3 - Restart SQL server service and check 'select @@servername' again.

Más info en: http://support.microsoft.com/default.aspx?scid=kb;en-us;Q303774

**** En el Directorio Virtual: ****
En este caso hay 3 máquinas involucradas, la del cliente, la del servidor de base de datos y la del servidor Web. Cuando se usa la autenticación por defecto en el directorio virtual, las credenciales para autenticar sirven sólo en una conexión, o sea, no se delegan (saltan sólo una vez). El problema es que para conectarse al servidor web se autentica con un token que luego no sale el de la maquina que tiene el servidor de base de datos, sino que sale el token del usuario con el que se logueó el ASPNET.
Si funciona si el servidor web está en la misma máquina que el cliente.
Una solución es usar un mecanismo de autenticación que soporte delegación, puede ser basic o kerberos. Lo que hay que tener en cuenta en estos casos es que el usuario y password van “clear text”.

Para esto seguir los siguientes pasos:
- Cambiar en el IIS, en el directorio virtual, que se conecte con Basic Authentication, ahi se van a habilitar 2 campos, para agregar el dominio y el realm. También hay que deshabilitar el Anonymous Access (primer check). Esto se configura en el directorio virtual / botón derecho / propiedades / Tab directory security / botón Edit / marcar el check basic authentication y desmarcar el Anonymous Access.
Cuando se ejecute el web panel va a aparecer una ventana para ingresar el usuario y password, habría que usar los mismo que se usan para conectarse a la red.
También en este caso se tiene que configurar el impersonate en el web.config con el usuario de red <dominio>\usuario y password. Luego de esto reiniciar el IIS.

Documento que explica como configurar esto: http://support.microsoft.com/default.aspx?scid=kb;en-us;810572

La explicación anterior también puede aplicarse cuando hay un firewall instalado en el servidor de base de datos y hace que no llegue el usuario a la base de datos, en ese caso también se pueden seguir los pasos mencionados arriba y ver si el usuario llega correctamente.

**** Para saber que usuario está llegando a la base de datos, seguir los siguiente pasos: ****
- En el Enterprise Manager, donde está definida la instancia del servidor de base de datos, seleccionar la opción: Management/Current Activity/Process Info. Ahi aparecen todos los procesos que estás ejecutando y que usuario se utiliza para la conexión de cada base de datos. Seguramente el proceso que tenga el número mayor es el que se está usando para esta conexión. Ver que usuario que aparece ahí.

No hay comentarios.:

Publicar un comentario