Seleccione dinámicamente el esquema de autenticación en ASP.net Core Web API.
Estoy trasladando una API web autoalojada construida con OWIN y el marco .NET a una API web ASP.NET Core (usando .NET 6.0)
En la API original, tengo un mecanismo de autenticación personalizado que selecciona el esquema de autenticación para cada llamada dinámicamente, basándose en una cabecera en la solicitud:
HttpListener listener = (HttpListener)appBuilder.Properties ["System.Net.HttpListener"];
listener.AuthenticationSchemeSelectorDelegate = nuevo AuthenticationSchemeSelector ((httpRequest) =>
{
if (httpRequest.Headers.AllKeys.Any (k => k == "MyCustomHeader"))
{
return AuthenticationSchemes.Ntlm;
}
else
{
return AuthenticationSchemes.Anonymous;
}
});
Básicamente, para cada solicitud compruebo una cabecera específica en la solicitud y en función de eso elijo si forzar que la solicitud utilice la autenticación de Windows o permitir que la solicitud proceda de manera anónima.
¿Cómo puedo replicar este comportamiento en ASP.net Core web api? Descubrí cómo usar la autenticación de Windows utilizando el paquete NuGet Microsoft.AspNetCore.Authentication.Negotiate y configurando:
services.AddAuthentication(NegotiateDefaults.AuthenticationScheme)
.AddNegotiate();
sin embargo, no sé cómo seleccionar dinámicamente si utilizar ese esquema o permitir llamadas anónimas en función de la cabecera como lo hice antes.
¿Es esto posible? ¿Cómo puedo hacerlo?
davy.ai
Sí, es posible seleccionar dinámicamente el esquema de autenticación en ASP.NET Core Web API en función de una cabecera específica en la solicitud. Aquí se explica cómo hacerlo:
AuthenticationHandler<toptions>
. TOptions denota las opciones que se pueden utilizar para configurar el esquema de autenticación. En su caso, como está utilizando la Autenticación de Windows, puede utilizarWindowsAuthenticationOptions
. Aquí tiene un ejemplo:En el método
HandleAuthenticateAsync
, comprueba si la cabecera personalizada está presente en la solicitud. Si está presente, devuelve unAuthenticateResult
que indica que la solicitud se ha autenticado utilizando la Autenticación de Windows. De lo contrario, devuelveAuthenticateResult.NoResult()
para indicar que la solicitud debe continuar de forma anónima.Registre el controlador de autenticación personalizado en el contenedor de inyección de dependencias llamando al método
AddAuthentication
en el métodoConfigureServices
de su claseStartup
:En este ejemplo, estamos agregando
CustomAuthenticationHandler
como un esquema con el esquema de autenticaciónNegociateDefaults.AuthenticationScheme
utilizado como esquema predeterminado.Finalmente, en el método
Configure
de su claseStartup
, llame al métodoUseAuthentication
para habilitar la autenticación para su API:¡Eso es todo! Ahora, cuando se recibe una solicitud, ASP.NET Core llamará al método
HandleAuthenticateAsync
deCustomAuthenticationHandler
para determinar si la solicitud debe autenticarse o no, en función de la presencia de la cabecera personalizada en la solicitud.</windowsauthenticationoptions,>