Configurar la autenticación de Windows en ASP.NET Core
Por Scott Addie
La autenticación de Windows (también conocida como autenticación de negociación, Kerberos o NTLM) puede configurarse para ASP.NET Core aplicaciones hospedadas con IIS, Kestrelo HTTP.sys.
La autenticación de Windows (también conocida como autenticación de negociación, Kerberos o NTLM) puede configurarse para ASP.NET Core aplicaciones hospedadas con IIS o HTTP.sys.
La autenticación de Windows se basa en el sistema operativo para autenticar a los usuarios de ASP.NET Core aplicaciones. Puede usar la autenticación de Windows cuando el servidor se ejecuta en una red corporativa con Active Directory identidades de dominio o cuentas de Windows para identificar a los usuarios. La autenticación de Windows es más adecuada para entornos de intranet en los que los usuarios, las aplicaciones cliente y los servidores Web pertenecen al mismo dominio de Windows.
Nota
La autenticación de Windows no es compatible con HTTP/2. Los desafíos de autenticación se pueden enviar en respuestas HTTP/2, pero el cliente debe degradar a HTTP/1.1 antes de la autenticación.
Escenarios de proxy y equilibrador de carga
La autenticación de Windows es un escenario con estado que se usa principalmente en una intranet, donde un proxy o un equilibrador de carga normalmente controla el tráfico entre clientes y servidores. Si se usa un proxy o un equilibrador de carga, la autenticación de Windows solo funciona si el proxy o el equilibrador de carga:
- Controla la autenticación.
- Pasa la información de autenticación del usuario a la aplicación (por ejemplo, en un encabezado de solicitud), que actúa en la información de autenticación.
Una alternativa a la autenticación de Windows en entornos en los que se usan servidores proxy y equilibradores de carga es Active Directory Federated Services (ADFS) con OpenID Connect (OIDC).
IIS/IIS Express
Agregar servicios de autenticación mediante la invocación AddAuthentication Microsoft.AspNetCore.Server.IISIntegration de (espacio de nombres) en Startup.ConfigureServices :
services.AddAuthentication(IISDefaults.AuthenticationScheme);
Configuración de inicio (depurador)
La configuración de la configuración de inicio solo afecta a las propiedades/launchSettings.jsdel archivo para IIS Express y no configura IIS para la autenticación de Windows. La configuración del servidor se explica en la sección IIS .
La plantilla de aplicación web disponible a través de Visual Studio o el CLI de .net Core puede configurarse para admitir la autenticación de Windows, que actualiza las propiedades o el launchSettings.jsen el archivo automáticamente.
Nuevo proyecto
- Cree un nuevo proyecto.
- Seleccione Aplicación web de ASP.NET Core. Seleccione Siguiente.
- Proporcione un nombre en el campo nombre del proyecto . Confirme que la entrada de Ubicación es correcta o proporcione una ubicación para el proyecto. Seleccione Crear.
- Seleccione cambiar en autenticación.
- En la ventana cambiar autenticación , seleccione autenticación de Windows. Seleccione Aceptar.
- Seleccione Aplicación web.
- Seleccione Crear.
Ejecute la aplicación. El nombre de usuario aparece en la interfaz de usuario de la aplicación representada.
Proyecto existente
Las propiedades del proyecto habilitan la autenticación de Windows y deshabilitan la autenticación anónima:
- Haga clic con el botón derecho en el proyecto en el Explorador de soluciones y seleccione Propiedades.
- Seleccione la pestaña Depurar.
- Desactive la casilla Habilitar autenticación anónima.
- Active la casilla Habilitar autenticación de Windows.
- Guarde y cierre la página de propiedades.
Como alternativa, las propiedades se pueden configurar en el iisSettings nodo del launchSettings.jsen el archivo:
"iisSettings": {
"windowsAuthentication": true,
"anonymousAuthentication": false,
"iisExpress": {
"applicationUrl": "http://localhost:52171/",
"sslPort": 44308
}
}
Al modificar un proyecto existente, confirme que el archivo de proyecto incluye una referencia de paquete para el metapaquete Microsoft. AspNetCore. app o el paquete NuGet Microsoft. AspNetCore. Authentication .
IIS
IIS usa el módulo ASP.net Core para hospedar ASP.net Core aplicaciones. La autenticación de Windows está configurada para IIS a través del archivo de web.config . En las secciones siguientes se muestra cómo:
- Proporcione un archivo de web.config local que active la autenticación de Windows en el servidor cuando se implemente la aplicación.
- Use el administrador de IIS para configurar el archivo de web.config de una aplicación ASP.net Core que ya se ha implementado en el servidor.
Si todavía no lo ha hecho, habilite IIS para hospedar ASP.NET Core aplicaciones. Para obtener más información, vea Hospedaje de ASP.NET Core en Windows con IIS.
Habilite el servicio de función IIS para la autenticación de Windows. Para obtener más información, vea Habilitar la autenticación de Windows en los servicios de rol de IIS (consulte el paso 2).
El middleware de integración con IIS está configurado para autenticar solicitudes automáticamente de forma predeterminada. Para obtener más información, vea Host ASP.net Core en Windows con IIS: opciones de IIS (AutomaticAuthentication).
El módulo ASP.NET Core está configurado para reenviar el token de autenticación de Windows a la aplicación de forma predeterminada. Para obtener más información, vea referencia de configuración del módulo ASP.net Core: atributos del elemento aspNetCore.
Use cualquiera de los métodos siguientes:
Antes de publicar e implementar el proyecto, agregue el siguiente archivo de web.config a la raíz del proyecto:
<?xml version="1.0" encoding="utf-8"?> <configuration> <location path="." inheritInChildApplications="false"> <system.webServer> <security> <authentication> <anonymousAuthentication enabled="false" /> <windowsAuthentication enabled="true" /> </authentication> </security> </system.webServer> </location> </configuration>Cuando el SDK de .NET Core publica el proyecto (sin la
<IsTransformWebConfigDisabled>propiedad establecida entrueen el archivo de proyecto), el archivo de web.config publicado incluye la<location><system.webServer><security><authentication>sección. Para obtener más información sobre la<IsTransformWebConfigDisabled>propiedad, vea Hospedaje de ASP.NET Core en Windows con IIS .Después de publicar e implementar el proyecto, realice la configuración del servidor con el administrador de IIS:
- En el administrador de IIS, seleccione el sitio de IIS en el nodo sitios de la barra lateral conexiones .
- Haga doble clic en autenticación en el área IIS .
- Seleccione autenticación anónima. Seleccione deshabilitar en la barra lateral de acciones .
- Seleccione Autenticación de Windows. Seleccione Habilitar en la barra lateral de acciones .
Cuando se realizan estas acciones, el administrador de IIS modifica el archivo de web.config de la aplicación.
<system.webServer><security><authentication>Se agrega un nodo con la configuración actualizada paraanonymousAuthenticationywindowsAuthentication:<system.webServer> <security> <authentication> <anonymousAuthentication enabled="false" /> <windowsAuthentication enabled="true" /> </authentication> </security> </system.webServer>La
<system.webServer>sección agregada al archivo web.config por el administrador de IIS está fuera de la sección de la aplicación<location>agregada por el SDK de .net Core cuando se publica la aplicación. Dado que la sección se agrega fuera del<location>nodo, todas las aplicaciones secundarias de la aplicación actual heredan la configuración. Para evitar la herencia, mueva la<security>sección agregada dentro de la<location><system.webServer>sección que proporciona el SDK de .net Core.Cuando se utiliza el administrador de IIS para agregar la configuración de IIS, solo afecta al archivo de web.config de la aplicación en el servidor. Una implementación posterior de la aplicación puede sobrescribir la configuración del servidor si la copia del servidor de web.config se reemplaza por el archivo web.config del proyecto. Use cualquiera de los métodos siguientes para administrar la configuración:
- Use el administrador de IIS para restablecer la configuración del archivo de web.config después de sobrescribir el archivo en la implementación.
- Agregue un archivo deweb.config a la aplicación localmente con la configuración.
Kestrel
El paquete NuGet Microsoft. AspNetCore. Authentication. Negotiate se puede usar con Kestrel para admitir la autenticación de Windows mediante Negotiate y Kerberos en Windows, Linux y MacOS.
Advertencia
Las credenciales se pueden conservar entre las solicitudes de una conexión. La autenticación Negotiate no debe usarse con servidores proxy a menos que el proxy mantenga una afinidad de conexión 1:1 (una conexión persistente) con Kestrel.
Nota
El controlador Negotiate detecta si el servidor subyacente admite la autenticación de Windows de forma nativa y si está habilitado. Si el servidor admite la autenticación de Windows pero está deshabilitado, se produce un error que le pide que habilite la implementación del servidor. Cuando la autenticación de Windows está habilitada en el servidor, el controlador de negociación lo reenvía de forma transparente.
Agregue servicios de autenticación invocando AddAuthentication y AddNegotiate en Startup.ConfigureServices :
// using Microsoft.AspNetCore.Authentication.Negotiate;
// using Microsoft.Extensions.DependencyInjection;
services.AddAuthentication(NegotiateDefaults.AuthenticationScheme)
.AddNegotiate();
Agregue middleware de autenticación mediante una llamada a UseAuthentication en Startup.Configure :
app.UseAuthentication();
Para obtener más información sobre middleware, vea Middleware de ASP.NET Core .
Se permiten las solicitudes anónimas. Utilice ASP.net Core autorización para desafiar las solicitudes anónimas de autenticación.
Configuración del entorno de Windows
El componente Microsoft. AspNetCore. Authentication. Negotiate realiza la autenticación de modo de usuario. Los nombres de entidad de seguridad de servicio (SPN) se deben agregar a la cuenta de usuario que ejecuta el servicio, no a la cuenta de equipo. Ejecute setspn -S HTTP/myservername.mydomain.com myuser en un shell de comandos administrativo.
Configuración del entorno de Linux y macOS
Las instrucciones para unir una máquina Linux o macOS a un dominio de Windows están disponibles en el artículo conexión Azure Data Studio a la SQL Server mediante la autenticación de Windows: Kerberos . Las instrucciones crean una cuenta de equipo para la máquina Linux en el dominio. Los SPN se deben agregar a esa cuenta de equipo.
Nota
Cuando siga las instrucciones que se indican en el artículo conexión de Azure Data Studio al SQL Server mediante la autenticación de Windows: Kerberos , reemplace python-software-properties por python3-software-properties si es necesario.
Una vez que la máquina Linux o macOS está unida al dominio, es necesario realizar pasos adicionales para proporcionar un archivo de fichas de claves con los SPN:
- En el controlador de dominio, agregue nuevos SPN de servicio Web a la cuenta del equipo:
setspn -S HTTP/mywebservice.mydomain.com mymachinesetspn -S HTTP/mywebservice@MYDOMAIN.COM mymachine
- Use ktpass para generar un archivo de la fichas de claves:
ktpass -princ HTTP/mywebservice.mydomain.com@MYDOMAIN.COM -pass myKeyTabFilePassword -mapuser MYDOMAIN\mymachine$ -pType KRB5_NT_PRINCIPAL -out c:\temp\mymachine.HTTP.keytab -crypto AES256-SHA1- Algunos campos deben especificarse en mayúsculas como se indica.
- Copie el archivo de la fichas de claves en el equipo Linux o macOS.
- Seleccione el archivo de la información de claves a través de una variable de entorno:
export KRB5_KTNAME=/tmp/mymachine.HTTP.keytab - Invoque
klistpara mostrar los SPN actualmente disponibles para su uso.
Nota
Un archivo de fichas de claves contiene credenciales de acceso de dominio y debe protegerse en consecuencia.
HTTP.sys
HTTP.sys admite la autenticación de Windows en modo kernel mediante la autenticación Negotiate, NTLM o básica.
Agregar servicios de autenticación mediante la invocación AddAuthentication Microsoft.AspNetCore.Server.HttpSys de (espacio de nombres) en Startup.ConfigureServices :
services.AddAuthentication(HttpSysDefaults.AuthenticationScheme);
Configure el host Web de la aplicación para usar HTTP.sys con la autenticación de Windows (Program.CS). UseHttpSysestá en el Microsoft.AspNetCore.Server.HttpSys espacio de nombres.
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>()
.UseHttpSys(options =>
{
options.Authentication.Schemes =
AuthenticationSchemes.NTLM |
AuthenticationSchemes.Negotiate;
options.Authentication.AllowAnonymous = false;
});
});
}
public class Program
{
public static void Main(string[] args) =>
BuildWebHost(args).Run();
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseHttpSys(options =>
{
options.Authentication.Schemes =
AuthenticationSchemes.NTLM |
AuthenticationSchemes.Negotiate;
options.Authentication.AllowAnonymous = false;
})
.Build();
}
Nota
HTTP.sys delega en la autenticación de modo kernel con el protocolo de autenticación de Kerberos. La autenticación de modo usuario no se admite con Kerberos y HTTP.sys. Se debe usar la cuenta de equipo para descifrar el token o el vale de Kerberos que se obtiene de Active Directory y que el cliente reenvía al servidor para autenticar al usuario. Registre el nombre de entidad de seguridad de servicio (SPN) para el host, no el usuario de la aplicación.
Nota
HTTP.sys no se admite en la versión 1709 o posterior de nano Server. Para usar la autenticación de Windows y HTTP.sys con nano Server, use un contenedor Server Core (Microsoft/windowsservercore). Para obtener más información sobre Server Core, vea ¿Qué es la opción de instalación Server Core en Windows Server?.
Autorizar a usuarios
El estado de configuración de acceso anónimo determina el modo en que [Authorize] [AllowAnonymous] se usan los atributos y en la aplicación. En las dos secciones siguientes se explica cómo administrar los Estados de configuración no permitidos y permitidos de acceso anónimo.
No permitir el acceso anónimo
Cuando se habilita la autenticación de Windows y se deshabilita el acceso anónimo, los [Authorize] [AllowAnonymous] atributos y no tienen ningún efecto. Si un sitio de IIS está configurado para no permitir el acceso anónimo, la solicitud nunca llega a la aplicación. Por esta razón, el [AllowAnonymous] atributo no es aplicable.
Permitir acceso anónimo
Cuando esté habilitada la autenticación de Windows y el acceso anónimo, utilice los [Authorize] [AllowAnonymous] atributos y. El [Authorize] atributo permite proteger los puntos de conexión de la aplicación que requieren autenticación. El [AllowAnonymous] atributo invalida el [Authorize] atributo en las aplicaciones que permiten el acceso anónimo. Para obtener información sobre el uso de atributos, vea Autorización simple en ASP.NET Core .
Nota
De forma predeterminada, los usuarios que carecen de autorización para tener acceso a una página presentan una respuesta HTTP 403 vacía. El middleware StatusCodePages puede configurarse para proporcionar a los usuarios una mejor experiencia de "acceso denegado".
Suplantación
ASP.NET Core no implementa la suplantación. Las aplicaciones se ejecutan con la identidad de la aplicación para todas las solicitudes, mediante el grupo de aplicaciones o la identidad del proceso. Si la aplicación debe realizar una acción en nombre de un usuario, use WindowsIdentity. RunImpersonated en un middleware de terminal en línea en Startup.Configure . Ejecute una sola acción en este contexto y, a continuación, cierre el contexto.
app.Run(async (context) =>
{
try
{
var user = (WindowsIdentity)context.User.Identity;
await context.Response
.WriteAsync($"User: {user.Name}\tState: {user.ImpersonationLevel}\n");
WindowsIdentity.RunImpersonated(user.AccessToken, () =>
{
var impersonatedUser = WindowsIdentity.GetCurrent();
var message =
$"User: {impersonatedUser.Name}\t" +
$"State: {impersonatedUser.ImpersonationLevel}";
var bytes = Encoding.UTF8.GetBytes(message);
context.Response.Body.Write(bytes, 0, bytes.Length);
});
}
catch (Exception e)
{
await context.Response.WriteAsync(e.ToString());
}
});
RunImpersonatedno es compatible con las operaciones asincrónicas y no debe usarse en escenarios complejos. Por ejemplo, no se admite el ajuste de solicitudes completas o cadenas de middleware.
Aunque el paquete Microsoft. AspNetCore. Authentication. Negotiate habilita la autenticación en Windows, Linux y MacOS, la suplantación solo se admite en Windows.
Transformaciones de notificaciones
Al hospedar con IIS, AuthenticateAsync no se llama a internamente para inicializar un usuario. Por tanto, se usa una implementación de IClaimsTransformation para transformar las notificaciones después de que cada autenticación no se active de forma predeterminada. Para obtener más información y un ejemplo de código que activa las transformaciones de notificaciones, vea Módulo ASP.NET Core .
Al hospedar con IIS en modo de proceso, AuthenticateAsync no se llama a internamente para inicializar un usuario. Por tanto, se usa una implementación de IClaimsTransformation para transformar las notificaciones después de que cada autenticación no se active de forma predeterminada. Para obtener más información y un ejemplo de código que active las transformaciones de notificaciones al hospedar en proceso, vea Módulo ASP.NET Core .