iis - tutorial - autenticacion windows asp net
Cómo implementar la Autenticación de Windows con IdentityServer 4 (3)
Pronto habrá más documentación aquí:
https://identityserver4.readthedocs.io
Pero, en resumen, sí, desde el punto de vista de IdentityServer, la autenticación de Windows es un proveedor externo (a diferencia de la cookie de autenticación nativa de IS).
No hay nada que USTED tenga que hacer para implementar la autenticación de Windows; solo use un host que lo admita.
Eso es cualquiera
- Kestrel con integración IIS
- WebListener
En ambos casos, invocará la maquinaria de Windows impugnando un esquema de Negotiate
o NTLM
. Esto no es específico de IS, sino la forma en que funciona ASP.NET Core.
Nuestra interfaz de usuario de inicio rápido muestra cómo hacerlo: verifique AccountController.
https://github.com/IdentityServer/IdentityServer4.Quickstart.UI
¿Cómo implementar correctamente la Autenticación de Windows con Identity Server 4? ¿Hay alguna muestra para hacer eso?
Miré el código fuente de IdentityServer 4 y en el proyecto de Host en AccountController noté que hay verificaciones de autenticación de Windows y que están implementados como un proveedor externo. Pero no puedo trabajar en la configuración. ¿Alguien ha implementado con éxito la autenticación de Windows con idsrv4 y cómo?
En AccountOptions.cs
de su servidor de identidad, asegúrese de que public static bool WindowsAuthenticationEnabled = true;
, Creo que el inicio rápido tiene esto predeterminado en false
Asegúrese de que su grupo de aplicaciones para el servidor de identidad esté usando una cuenta con las credenciales adecuadas (supongo que una cuenta que puede consultar a AD). No pude usar las cuentas integradas AppPoolIdentity, LocalService o Network. LocalSystem casi funcionó pero a través de otro error.
Inicie sesión al menos una vez en este servidor web con la cuenta que creó anteriormente para el grupo de aplicaciones. Esta cuenta no tiene que ser ningún tipo de administrador. Establezca la configuración avanzada en el grupo de aplicaciones para cargar el perfil.
Use Credenciales anónimas y de Windows establecidas en IIS en la raíz de su Servidor de identidad, no necesita resumen o básico.
Para cualquiera que se encuentre con esto en los resultados de búsqueda que tiene problemas para conectar el inicio rápido con el inicio rápido de identidad de ASPNET, aquí están las piezas faltantes.
En su mayor parte, desea utilizar el código de identidad ASPNET, utilizando el gestor de inicio de sesión para hacer el trabajo pesado. Una vez que llegue allí y agregue el código de autenticación de Windows desde el inicio rápido, debe llegar al punto donde todo parece que está funcionando, pero obtiene nulo en esta línea en la devolución de llamada:
ExternalLoginInfo info = await _signInManager.GetExternalLoginInfoAsync();
Para tratar a Windows como un proveedor externo real, en lugar de agregar "esquema" a las propiedades de autenticación alrededor de la línea 163, desea cambiar la clave a "Proveedor de inicio de sesión":
properties.Items.Add("LoginProvider", AccountOptions.WindowsAuthenticationSchemeName);
Utilizo una consulta de dominio para obtener información adicional sobre mis usuarios, se ve así:
using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, domain))
using (UserPrincipal up = UserPrincipal.FindByIdentity(pc, wp.Identity.Name))
{
if (up == null)
{
throw new NullReferenceException($"Unable to find user: {wp.Identity.Name}");
}
id.AddClaim(new Claim(ClaimTypes.NameIdentifier, up.Sid.Value));
id.AddClaim(new Claim(JwtClaimTypes.Subject, wp.Identity.Name));
id.AddClaim(new Claim(JwtClaimTypes.Name, wp.Identity.Name));
id.AddClaim(new Claim(JwtClaimTypes.Email, up.EmailAddress));
id.AddClaim(new Claim(Constants.ClaimTypes.Upn, up.UserPrincipalName));
id.AddClaim(new Claim(JwtClaimTypes.GivenName, up.GivenName));
id.AddClaim(new Claim(JwtClaimTypes.FamilyName, up.Surname));
}
Qué reclamos agregar depende de usted, pero NECESITA uno de tipo ClaimTypes.NameIdentifier para que el SigninManager encuentre. SID parece ser el mejor uso para mí. Lo último que debe cambiar es la llamada SignInAsync para usar el esquema correcto alrededor de la línea 178-181:
await HttpContext.SignInAsync(IdentityConstants.ExternalScheme, new ClaimsPrincipal(id), properties);
A menos que esté anulando los Esquemas predeterminados que IdentityServer4 está utilizando en .net core 2, este es el esquema predeterminado correcto. ¡Y ahora su llamada a GetExternalLoginInfoAsync en la devolución de llamada funcionará y puede continuar!