Implementación de autenticación de esquema básico estilo Microsoft fácil de usar y muy liviana para ASP.NET Core.
Ver en GitHub
.NET Framework 4.6.1 y/o NetStandard 2.0 en adelante
Múltiples objetivos: net8.0; neto7.0; neto6.0; neto5.0; netcoreapp3.1; netcoreapp3.0; estándar de red2.0; net461
Esta biblioteca está publicada en NuGet. Por lo tanto, el paquete NuGet se puede instalar directamente en su proyecto si desea utilizarlo sin realizar ningún cambio personalizado en el código.
Descargue directamente desde el siguiente enlace. Considere descargar el nuevo paquete ya que el anterior ha quedado obsoleto.
Nuevo enlace de paquete: AspNetCore.Authentication.Basic.
Enlace de paquete antiguo: Mihir.AspNetCore.Authentication.Basic.
O ejecutando el siguiente comando en su proyecto.
PM> Install-Package AspNetCore.Authentication.Basic
Las muestras están disponibles en el directorio de muestras.
Configurarlo es bastante sencillo. Necesitará conocimientos prácticos básicos de ASP.NET Core 2.0 o posterior para comenzar a utilizar esta biblioteca.
Hay 2 formas diferentes de utilizar esta biblioteca para hacer su trabajo. Se pueden mezclar ambas formas si es necesario.
1]Usando la implementación de IBasicUserValidationService
2] Usando BasicOptions.Events (delegado OnValidateCredentials), que es el mismo enfoque que encontrará en las bibliotecas de autenticación de Microsoft.
Notas:
Requiere que Realm esté configurado en las opciones si SuppressWWWAuthenticateHeader no está configurado.
Si se utiliza una implementación de la interfaz IBasicUserValidationService y también se establece el delegado BasicOptions.Events.OnValidateCredentials, este delegado se utilizará primero.
Utilice siempre el protocolo HTTPS (Certificado SSL) en producción cuando utilice la autenticación básica.
usando AspNetCore.Authentication.Basic;public class Startup{public void ConfigureServices(IServiceCollection Services){// Requiere que Realm esté configurado en las opciones si SuppressWWWAuthenticateHeader no está configurado.// Si se usa una implementación de la interfaz IBasicUserValidationService, así como opciones .Events.OnValidateCredentials delegado también está configurado, entonces se utilizará este delegado first.services.AddAuthentication(BasicDefaults.AuthenticationScheme)// El siguiente AddBasic sin parámetro de tipo requerirá que se configure la eliminación de options.Events.OnValidateCredentials.//.AddBasic(options => { options.Realm = "My App"; }) ;// El siguiente AddBasic con parámetro de tipo agregará BasicUserValidationService al contenedor de dependencia. .AddBasic<BasicUserValidationService>(options => { options.Realm = "My App"; });services.AddControllers();//// De forma predeterminada, la autenticación no se cuestiona para cada solicitud, que es la intención predeterminada de ASP.NET Core Comportamiento.//// Entonces, para desafiar la autenticación para cada solicitud, utilice la siguiente opción FallbackPolicy.//services.AddAuthorization(options =>//{// options.FallbackPolicy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build();//});}public void Configure(IApplicationBuilder app, IHostingEnvironment env){app.UseHttpsRedirection();// El siguiente orden de cadena de canalización es ¡importante!app.UseRouting();app.UseAuthentication();app.UseAuthorization();app.UseEndpoints(endpoints =>{endpoints.MapControllers();});}}
usando AspNetCore.Authentication.Basic;public class Startup{public void ConfigureServices(IServiceCollection Services){// Requiere que Realm esté configurado en las opciones si SuppressWWWAuthenticateHeader no está configurado.// Si se usa una implementación de la interfaz IBasicUserValidationService, así como opciones .Events.OnValidateCredentials delegado también está configurado, entonces se utilizará este delegado first.services.AddAuthentication(BasicDefaults.AuthenticationScheme)// El siguiente AddBasic sin parámetro de tipo requerirá que se configure la eliminación de options.Events.OnValidateCredentials.//.AddBasic(options => { options.Realm = "My App"; }) ;// El siguiente AddBasic con parámetro de tipo agregará BasicUserValidationService al contenedor de dependencia. .AddBasic<BasicUserValidationService>(options => { options.Realm = "My App"; });services.AddMvc();//// De forma predeterminada, la autenticación no se cuestiona para cada solicitud, que es la intención predeterminada de ASP.NET Core Comportamiento.//// Entonces, para desafiar la autenticación para cada solicitud, utilice la siguiente opción en lugar de los servicios.AddMvc().//services.AddMvc(options => //{// anteriores). options.Filters.Add(new AuthorizeFilter(new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build()));//});}public void Configure(aplicación IApplicationBuilder, entorno IHostingEnvironment){app.UseAuthentication();app.UseMvc ();}}
usando AspNetCore.Authentication.Basic;clase pública BasicUserValidationService: IBasicUserValidationService{ILogger privado de solo lectura<BasicUserValidationService> _logger;IUserRepository privado de solo lectura _userRepository;servicio público BasicUserValidationService(ILogger<BasicUserValidationService> registrador, IUserRepository userRepository){_logger = logger;_userRepository = userRepository;}tarea asíncrona pública<bool> IsValidAsync(nombre de usuario de cadena, contraseña de cadena){try{// NOTA: NO USE ESTA IMPLEMENTACIÓN. ESTO ES SÓLO PARA FINES DE DEMOSTRACIÓN// Escriba su implementación aquí y devuelva verdadero o falso dependiendo de la validación. var usuario = await _userRepository.GetUserByUsername(nombre de usuario);var isValid = usuario! = nulo && usuario. isValid;}catch (Exception e){_logger.LogError(e, e.Message);throw;}}}
Debe configurarse si SuppressWWWAuthenticateHeader no está configurado en verdadero. Se utiliza con el encabezado de respuesta WWW-Authenticate cuando se cuestionan solicitudes no autenticadas.
El valor predeterminado es falso.
Si se establece en verdadero, NO devolverá el encabezado de respuesta WWW-Authenticate al cuestionar solicitudes no autenticadas.
Si se establece en falso, devolverá el encabezado de respuesta WWW-Authenticate al cuestionar solicitudes no autenticadas.
El valor predeterminado es falso.
Si se establece en verdadero, verifica si AllowAnonymous filtra la acción del controlador o los metadatos en el punto final y, si se encuentra, no intenta autenticar la solicitud.
El objeto proporcionado por la aplicación para procesar eventos generados por el middleware de autenticación básica.
La aplicación puede implementar la interfaz completamente o puede crear una instancia de BasicEvents y asignar delegados solo a los eventos que desea procesar.
Se invocará a un delegado asignado a esta propiedad justo antes de validar las credenciales.
Debe proporcionar un delegado para esta propiedad para que se produzca la autenticación.
En su delegado, debe llamar a context.ValidationSucceeded(), que manejará la construcción del principal de reclamos de autenticación a partir de los detalles del usuario a los que se les asignará la propiedad context.Principal y llama a context.Success(), o construir un principal de reclamos de autenticación a partir del usuario. detalles y asígnelo a la propiedad context.Principal y finalmente llame al método context.Success().
Si solo se establece la propiedad context.Principal sin llamar al método context.Success(), entonces, se llama automáticamente al método Success().
Se invocará un delegado asignado a esta propiedad cuando la autenticación sea exitosa. No se llamará si se asigna el delegado OnValidateCredentials.
Se puede utilizar para agregar reclamos, encabezados, etc. a la respuesta.
Se invocará un delegado asignado a esta propiedad cuando se produzca cualquier excepción inesperada dentro de la biblioteca.
Se invocará a un delegado asignado a esta propiedad antes de enviar un desafío a la persona que llama cuando se maneja una respuesta no autorizada.
Utilice esto únicamente si sabe lo que está haciendo y si desea utilizar una implementación personalizada. Configure el delegado para que se ocupe de las inquietudes de desafío 401, si un esquema de autenticación en cuestión trata una interacción de autenticación como parte de su flujo de solicitud. (como agregar un encabezado de respuesta o cambiar el resultado 401 a 302 de una página de inicio de sesión o una ubicación de inicio de sesión externa).
Llame a context.Handled() al final para que se omita cualquier lógica predeterminada para este desafío.
Se invocará un delegado asignado a esta propiedad si la autorización falla y da como resultado una respuesta prohibida.
Utilice esto únicamente si sabe lo que está haciendo y si desea utilizar una implementación personalizada.
Configure el delegado para que maneje Prohibir.
Llame a context.Handled() al final para que se omita cualquier lógica predeterminada.
Con ASP.NET Core, no se cuestiona la autenticación de todas las solicitudes de forma predeterminada. Así que no se preocupe si su BasicUserValidationService no se ve afectado cuando no pasa los detalles de autenticación básicos requeridos con la solicitud. Es un comportamiento normal. ASP.NET Core desafía la autenticación solo cuando se le indica específicamente que lo haga, ya sea decorando el controlador/método con el atributo de filtro [Autorizar] o por algún otro medio.
Sin embargo, si desea que todas las solicitudes desafíen la autenticación de forma predeterminada, dependiendo de lo que esté usando, puede agregar la siguiente línea de opciones al método ConfigureServices en la clase Startup .
// En ASP.NET Core 3.0 en adelanteservices.AddAuthorization(options =>{options.FallbackPolicy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build();});// O// En ASP.NET Core 2.0 en adelanteservices.AddMvc (opciones => {opciones.Filters.Add(nuevo AuthorizeFilter(nuevo AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build()));});
Si no está utilizando MVC pero usa Endpoints en ASP.NET Core 3.0 o posterior, puede agregar un método de cadena .RequireAuthorization()
al mapa de endpoints en Configurar método en la clase de inicio como se muestra a continuación.
// ASP.NET Core 3.0 en adelanteapp.UseEndpoints(endpoints =>{endpoints.MapGet("/", async context =>{await context.Response.WriteAsync("Hello World!");}).RequireAuthorization(); / / ¡¡¡TENGA EN CUENTA ESTO AQUÍ !!!! });
ASP.NET Core admite la adición de múltiples esquemas de autenticación que también admite esta biblioteca. Sólo es necesario utilizar el método de extensión que toma el nombre del esquema como parámetro. El resto es todo igual. Esto se puede lograr de muchas maneras diferentes. A continuación se muestra solo un ejemplo rápido y aproximado.
Tenga en cuenta que el parámetro de nombre del esquema puede ser cualquier cadena que desee.
public void ConfigureServices(servicios IServiceCollection){services.AddTransient<IUserRepository, InMemoryUserRepository>();services.AddAuthentication("Scheme1").AddBasic<BasicUserValidationService>("Scheme1", opciones => { opciones.Realm = "Mi aplicación"; }).AddBasic<BasicUserValidationService_2>("Scheme2", opciones => { opciones.Realm = "Mi aplicación"; }).AddBasic("Scheme3", opciones => { opciones.Realm = "Mi aplicación"; opciones.Events = new BasicEvents{OnValidateCredentials = async (contexto) =>{var userRepository = context.HttpContext.RequestServices.GetRequiredService<IUserRepository>();var usuario = await userRepository.GetUserByUsername(context.Username);var isValid = usuario! = nulo && usuario.Contraseña == context.Password;if (isValid){context.Response.Headers.Add("ValidationCustomHeader", "From OnValidateCredentials");var Claims = new[]{new Claim("CustomClaimType", "Valor de reclamo personalizado - de OnValidateCredentials") };context.ValidationSucceeded(reclamaciones); // las reclamaciones son opcionales}else{context.ValidationFailed();}}}});services.AddControllers();services.AddAuthorization(options =>{options.FallbackPolicy = new AuthorizationPolicyBuilder("Scheme1", "Scheme2", " Scheme3").RequireAuthenticatedUser().Build();});}
Versión | Notas |
---|---|
8.0.0 |
|
7.0.0 |
|
6.0.1 |
|
5.1.0 |
|
5.0.0 |
|
3.1.1 |
|
3.1.0 |
|
2.2.0 |
|
RFC 7617: especificación técnica para HTTP básico
Documentación de seguridad de ASP.NET Core
aspnet/Seguridad
Licencia MIT