Cómo: Obtener acceso a SQL Server mediante la seguridad integrada de Windows
Actualización: noviembre 2007
Si la aplicación se ejecuta en una intranet basada en Windows, para el acceso a bases de datos podría usar la autenticación de Windows integrada. La seguridad integrada utiliza la identidad de Windows actual establecida en el subproceso del sistema operativo para tener acceso a la base de datos de SQL Server. A continuación, puede asignar la identidad de Windows y permisos a una base de datos de SQL Server.
Para conectarse a SQL Server mediante la autenticación de Windows integrada, debe identificar la identidad de Windows con la que su aplicación ASP.NET se está ejecutando. También debe tener la certeza de que se ha concedido a la identidad acceso a la base de datos de SQL Server. En este tema se incluye un ejemplo de código en el que se muestra la actual identidad de Windows de la aplicación ASP.NET.
Conectar a SQL Server
Si SQL Server se encuentra en un equipo distinto que el servidor Web, la identidad de Windows debe poder fluir a través de la red hasta la instancia remota de SQL Server. (Las redes Windows debidamente configuradas con autenticación Kerberos lo permiten). Sin embargo, en función de la configuración del elemento de configuración identity, la identidad de Windows establecida en el subproceso de sistema operativo para aplicaciones ASP.NET quizá no permita un flujo adecuado hasta el servidor SQL Server remoto.
Puede proporcionar un nombre de usuario y una contraseña específicos para la identidad del proceso de trabajo del sitio Web tal como se muestra en Cómo: Obtener acceso a SQL Server mediante un usuario de dominio Windows asignado, o bien utilizar los datos de la identidad autenticada que proporciona Servicios de Internet Information Server (IIS). Para utilizar los datos de la identidad de Windows que proporciona Servicios de IIS, establezca el atributo impersonate del elemento de configuración identity como true, tal como se muestra en el siguiente ejemplo:
<system.web>
<identity impersonate="true" />
</system.web>
En Servicios de IIS, sólo con la Autenticación básica inician sesión los usuarios con un símbolo (token) de seguridad que fluye por la red a un servidor SQL Server remoto. De forma predeterminada, otros modos de seguridad de Servicios de IIS que se utilicen conjuntamente con la configuración del elemento de configuración identity no darán como resultado un símbolo que se pueda autenticar en un servidor SQL Server remoto.
Si el sitio Web está configurado para que sólo admita accesos anónimos en Servicios de IIS, el símbolo de seguridad que se pase desde Servicios de IIS debe ser el de la cuenta de usuario de Windows para acceso anónimo según la configuración de Servicios de IIS. La cuenta de usuario anónimo se puede utilizar para la autenticación con un servidor SQL Server remoto. Sin embargo, la cuenta de usuario anónimo predeterminada es una cuenta del equipo local, por lo que no existirá como cuenta en el servidor SQL Server remoto. Puede cambiar la cuenta anónima de Servicios de IIS para utilizar una cuenta de dominio, o bien reflejar la cuenta del equipo local en el servidor SQL Server remoto mediante la creación en el servidor SQL Server remoto de una cuenta local con el mismo nombre de usuario y contraseña. Además, la propiedad de la metabase LogonMethod para IIS6 debe establecerse como una opción que permita a las credenciales fluir por la red. Por ejemplo, la configuración de metabase MD_LOGON_NETWORK_CLEARTEXT permite a las credenciales de inicio de sesión fluir por la red.
Si tiene dudas acerca de la identidad de Windows de su aplicación y de si esa identidad ha iniciado sesión con un símbolo (token) que puede fluir por la red, puede ejecutar al siguiente página ASP.NET como parte de la aplicación para que se muestre el nombre de la identidad de Windows y un valor que indique si la identidad puede fluir por la red. Observe que en el ejemplo siguiente no se tiene en cuenta si la delegación de Kerberos se ha configurado correctamente para su dominio.
<%@ Page Language="VB" %>
<%@ Import namespace="System.Security.Principal" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
<title>ASP.NET Example</title>
<script >
Public Function WillFlowAcrossNetwork(w As WindowsIdentity) As Boolean
For Each s As SecurityIdentifier In w.Groups
If s.IsWellKnown(WellKnownSidType.InteractiveSid) Then Return True
If s.IsWellKnown(WellKnownSidType.BatchSid) Then Return True
If s.IsWellKnown(WellKnownSidType.ServiceSid) Then Return True
Next
Return False
End Function
</script>
</head>
<body>
<%
Dim current As WindowsIdentity = WindowsIdentity.GetCurrent()
Response.Write(current.Name & ", " & WillFlowAcrossNetwork(current) & "<br />")
%>
</body>
</html>
<%@ Page Language="C#" %>
<%@ Import namespace="System.Security.Principal" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
<title>ASP.NET Example</title>
<script >
public bool WillFlowAcrossNetwork(WindowsIdentity w)
{
foreach (SecurityIdentifier s in w.Groups)
{
if (s.IsWellKnown(WellKnownSidType.InteractiveSid)) { return true; }
if (s.IsWellKnown(WellKnownSidType.BatchSid)) { return true; }
if (s.IsWellKnown(WellKnownSidType.ServiceSid)) { return true; }
}
return false;
}
</script>
</head>
<body>
<%
WindowsIdentity current = WindowsIdentity.GetCurrent();
Response.Write(current.Name + ", " + WillFlowAcrossNetwork(current) + "<br />");
%>
</body>
</html>
En el siguiente procedimiento se muestra cómo obtener acceso a una base de datos de SQL Server mediante la autenticación de Windows integrada en un escenario de intranet, en el que a todos los usuarios se les ha otorgado acceso a SQL Server de forma individual.
Para empezar, es preciso configurar la aplicación en Servicios de IIS para deshabilitar el acceso anónimo y habilitar la autenticación de Windows.
Para configurar los Servicios de IIS para la autenticación de Windows integrada
En Windows, abra la herramienta de administración Servicios de Internet Information Server. En Windows 2000 o Windows 2003, en el menú Inicio de Windows, elija Programas, Herramientas administrativas y, a continuación, en Administrador de servicios Internet. En Windows XP, abra Herramientas administrativas en el Panel de control.
Abra el nodo del servidor y, a continuación, abra nodos hasta que encuentre el de la aplicación, normalmente bajo Sitio Web predeterminado.
Haga clic con el botón secundario del mouse (ratón) en la aplicación y haga clic en Propiedades.
En la ficha Seguridad de directorios, haga clic en Editar.
En el cuadro de diálogo Métodos de autenticación, desactive la casilla de verificación Acceso anónimo. Si SQL Server está en el mismo equipo que Servicios de IIS, asegúrese de que está activada la opción Autenticación de Windows integrada. Si SQL Server es un servidor remoto, asegúrese de que está activada la casilla de verificación Autenticación básica y está desactivada la casilla de verificación Autenticación de Windows integrada.
Haga clic en todos los cuadros de diálogo.
En el archivo de configuración de la aplicación (Web.config), especifique que la aplicación utilizará las credenciales del usuario proporcionadas por Servicios de IIS.
Para configurar Web.config de modo que utilice los datos de identidad proporcionados por Servicios de IIS
Abra el archivo Web.config de la aplicación y agregue lo siguiente al elemento system.web:
<identity impersonate="true"/>
Nota: Por lo que respecta a los elementos del archivo Web.config, se diferencia entre mayúsculas y minúsculas.
Cuando se crea una cadena de conexión para obtener acceso a SQL Server, es preciso incluir atributos que indican a SQL Server que se está usando la seguridad integrada.
Para configurar cadenas de conexión para la seguridad integrada de Windows
En cualquier cadena de conexión para SQL Server, incluya el atributo Trusted_Connection=Yes y quite los atributos username y password.
En el código siguiente se muestra una cadena de conexión típica configurada para la seguridad integrada de Windows:
"workstation id=WebServer1;packet size=4096; Trusted_Connection=Yes;data source=SQLServer01"; persist security info=False;initial catalog=northwind"
Configure SQL Server para que reconozca a los usuarios que tendrán acceso al servidor.
Para configurar SQL Server para la seguridad integrada de Windows
En el menú Inicio de Windows, elija Microsoft SQL Server y, a continuación, haga clic en Administrador corporativo.
Abra el nodo del servidor y expanda el nodo de la base de datos para la que desee conceder permisos.
Haga clic con el botón secundario en el nodo Usuarios y elija Nuevo usuario de base de datos.
En el cuadro de diálogo Propiedades de usuario de base de datos, escriba domain\username en el cuadro Nombre de inicio de sesión y, a continuación, haga clic en Aceptar. Además, puede configurar SQL Server para que permita a todos los usuarios del dominio el acceso a la base de datos.
Vea también
Conceptos
Acceso a SQL Server desde una aplicación Web