2010-01-20 20 views
14

Estoy tratando de usar suplantación y delegación en una intranet de la aplicación web ASP.Net para pasar las credenciales de los usuarios autenticados a un servidor SQL.Aplicación web ASP.Net que intenta utilizar suplantación y delegación para conectarse a SQL Server

El servidor web y el servidor SQL son dos máquinas separadas, pero en el mismo dominio, por lo que se requiere delegación.

que he hecho lo siguiente:

  • conjunto <authentication mode="Windows"/> y <identity impersonate="true"/> en web.config de mi web-app.
  • habilitado Delegación restringida desde el servidor web al servicio MSSQLSvc en el servidor SQL, en Active Directory.
  • habilitado solo Autenticación de Windows en el sitio web, a través de IIS.

Al parecer, este debería funcionar, pero no lo hace (el SQL Server deniega el acceso al usuario anónimo - "Error de usuario 'NT AUTHORITY \ ANONYMOUS LOGON'").

En IIS7, el grupo de aplicaciones está configurado para usar el modo de línea integrada y se ejecuta con la identidad del servicio de red. El sitio web solo tiene habilitada la autenticación de Windows, la protección extendida está desactivada, la autenticación en modo Kernel está habilitada y NTLM es el proveedor.

Todas las páginas web que he leído parecen indicar que mi configuración debería funcionar. ¿Qué me estoy perdiendo?

+0

"el SQL Server niega el acceso al usuario anónimo", ¿tiene acceso el 'usuario anónimo' a la base de datos? –

+0

El usuario anónimo no tiene acceso a la base de datos. No quiero que el usuario anónimo acceda a la base de datos, quiero el usuario actual del sitio web. La delegación debe significar que el usuario actual es el que accede a la base de datos, en lugar del usuario anónimo. –

Respuesta

16

he descubierto la respuesta:

El proveedor de autenticación de Windows en IIS 7 debe ajustarse a Negociar: Kerberos, no NTLM. Esto significa que la configuración de autenticación en modo Kernel debe estar deshabilitada. Esto parece estar bien. Creo que estoy en lo cierto al decir que la autenticación en modo Kernel es necesaria cuando se utiliza una identidad personalizada, es decir, una identidad específica. La delegación puede usar un número arbitrario de identidades. Entonces todo está bien.

He escrito un blog post sobre esto también, que entra un poco más de detalle.

+0

La publicación del blog fue Excelente, muchas gracias :) – Chiramisu

+0

¿Tuvo algún problema con los usuarios que no obtienen sus credenciales reenviadas al servidor SQL cuando utilizan un navegador distinto de Internet Explorer? Descubrí que una vez que tienen una sesión establecida en IE, el sitio web puede delegar sus credenciales si cambian a un navegador diferente. –

-1

No, no es exacto decir que necesita Kerberos, un SPN, para confiar en el servidor para la delegación, y que esta es la ÚNICA manera de hacerlo. Sí, esta es una forma de hacerlo (y lo necesita todo para que sea posible a través de Kerberos), pero no es la ÚNICA manera, ni siquiera la más segura ni la más fácil. ¿Realmente desea tener que hacer configuraciones adicionales y crear un inicio de sesión para cada usuario de la web a su base de datos en SQL? ¿Qué pasa si cualquiera de esas cuentas está en peligro? Más cuentas, más vulnerabilidades.

No, cree una cuenta de servicio de dominio, y deje que acceda a SQL. Si sus chicos de seguridad cierran las cosas, dele a este usuario estos derechos: inicie sesión como un servicio, inicie sesión como un trabajo por lotes y permita el inicio de sesión localmente. O bien, si esto es solo para desarrollar y probar la teoría, o si no le importa o no puede encontrar la configuración o si aún recibe errores más adelante, y esto podría no obtener una gran cantidad de seguidores, pero dele la administración local (a veces tengo que hacer lo que tienes que hacer - algunos profesionales de seguridad cierran las cosas más de lo que me gustaría escribir - siempre puede solucionar problemas de seguridad más tarde para volver a cerrarla). Luego configure esa cuenta como la cuenta personalizada en el grupo de aplicaciones y otorgue a esa cuenta un inicio de sesión en SQL. Dale dbo en solo esa base de datos.

En el sitio web de IIS, configure el tipo de autenticación como Windows. Los he visto decir "Básico" en otros blogs para que Kerberos funcione, pero NTLM utiliza la autenticación de Windows. En IIS 7, es posible que también desee habilitar ASP.Suplantación NET. Personalmente, solo he probado esto en IIS 6, pero el principal es el mismo.

En el web.config, agregue esto bajo <configuration>, que es un "par" a <system.web>:

<connectionStrings> 
    <add 
    name="NorthwindConnectionString" 
    connectionString="Data Source=serverName;Initial 
    Catalog=Northwind;Integrated Security=SSPI;User 
    ID=userName;Password=password" 
    providerName="System.Data.SqlClient" 
    /> 
</connectionStrings> 

Y en <system.web>:

<authentication mode="Windows"/> 
<identity impersonate="true" 
     userName="domain\user" 
     password="password" /> 

Luego leer la cadena en su aplicación como esto:

using System.Configuration; 

string connString = String.Empty; 
if (ConfigurationManager.ConnectionStrings.ConnectionStrings.Count > 0) 
{ 
    connString = ConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString; 
    if (connString != null) // do DB connection stuff here 
     Console.WriteLine("Northwind connection string = \"{0}\"", 
     connString.ConnectionString); 
    else 
     Console.WriteLine("No Northwind connection string"); 
} 

Ver http://msdn.microsoft.com/en-us/library/ms178411.aspx.

Si no se conecta con la cuenta de servicio después de completar esa cuenta en el archivo web.config para la etiqueta impersonate y la conexión SQL, puede usar los métodos de suplantación utilizando WindowsImpersonationContext (http://msdn.microsoft.com/en-us/library/system.security.principal.windowsimpersonationcontext.aspx). Específicamente, quiere wic.Impersonate() y wic.Undo() después de obtener su token. Puede leer en el dominio, nombre y contraseña de la cuenta de servicio desde web.config, en la forma de AppKeys.

En resumen, hay formas de solucionar los problemas. Incluso puede cifrar la contraseña en el archivo web.config, tanto en ConnectionString como si desea almacenarlo en un AppKey en lugar de directamente en la etiqueta "impersonate", si no desea las contraseñas de texto sin formato (que Recomendaría en contra), por lo que puede tenerlo para la creación de un token de Inicio de sesión, si necesita utilizar los métodos de Suplantación (como yo lo hice).

+0

Esto en realidad no responde a su pregunta –

+0

@FireLizzard, di todos los pasos necesarios para "usar suplantación y delegación en una intranet de la aplicación web ASP.Net para pasar las credenciales autenticadas de los usuarios a un servidor SQL". Esto requiere 1) una cuenta svc, 2) derechos en la Política de seguridad local (descrita anteriormente) 3) derechos en SQL (dbo - descrito anteriormente), 3) agregar cuenta a la identidad del grupo de aplicaciones, 4) configurar el sitio web en IIS para Windows autenticación, 5) establecer la cadena de conexión en web.config, 6) establecer la etiqueta de autenticación y la identidad en web.config, 7) agregar la cadena de conexión en el código, 8) usar el código de suplantación en el enlace de MSDN si no funciona. – vapcguy

+0

Diferentes entornos van a tener diferentes derechos, en lo que respecta a las cuentas, y puede tener o no privilegios para otorgar a la cuenta los derechos que necesita. Sin conocer su entorno, es difícil dar los detalles de exactamente qué funcionará. Tendrá que tratar de darle a la aplicación svc los derechos que he especificado, y configurar el sitio web y web.config. Tal vez funcionará sin el código de suplantación de MSDN, tal vez no. Para mi implementación que acababa de completar cuando publiqué estos pasos, lo necesitaba. Por una que he hecho recientemente usando Kerberos, SPNs y un svc acct, no lo hice. – vapcguy

Cuestiones relacionadas