es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , , , ,

Answer

  1. Avatar for 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:

    1. Cree un controlador de autenticación personalizado heredando de la clase 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 utilizar WindowsAuthenticationOptions. Aquí tiene un ejemplo:
      public class CustomAuthenticationHandler : AuthenticationHandler<windowsauthenticationoptions>
      {
          protected override async Task<authenticateresult> HandleAuthenticateAsync()
          {
              if (Request.Headers.ContainsKey("MyCustomHeader"))
              {
                  return await Context.AuthenticateAsync(NegotiateDefaults.AuthenticationScheme);
              }
      
              return await Task.FromResult(AuthenticateResult.NoResult());
          }
      }
      

      En el método HandleAuthenticateAsync, comprueba si la cabecera personalizada está presente en la solicitud. Si está presente, devuelve un AuthenticateResult que indica que la solicitud se ha autenticado utilizando la Autenticación de Windows. De lo contrario, devuelve AuthenticateResult.NoResult() para indicar que la solicitud debe continuar de forma anónima.

    2. Registre el controlador de autenticación personalizado en el contenedor de inyección de dependencias llamando al método AddAuthentication en el método ConfigureServices de su clase Startup:

      services.AddAuthentication(options =>
      {
          options.DefaultScheme = NegociateDefaults.AuthenticationScheme;
          options.DefaultChallengeScheme = NegociateDefaults.AuthenticationScheme;
      })
      .AddScheme<windowsauthenticationoptions, customauthenticationhandler="">(NegociateDefaults.AuthenticationScheme, options => {});
      

      En este ejemplo, estamos agregando CustomAuthenticationHandler como un esquema con el esquema de autenticación NegociateDefaults.AuthenticationScheme utilizado como esquema predeterminado.

    3. Finalmente, en el método Configure de su clase Startup, llame al método UseAuthentication para habilitar la autenticación para su API:

      app.UseRouting();
      app.UseAuthentication();
      app.UseAuthorization();
      app.UseEndpoints(endpoints =>
      {
          endpoints.MapControllers();
      });
      

    ¡Eso es todo! Ahora, cuando se recibe una solicitud, ASP.NET Core llamará al método HandleAuthenticateAsync de CustomAuthenticationHandler para determinar si la solicitud debe autenticarse o no, en función de la presencia de la cabecera personalizada en la solicitud.</windowsauthenticationoptions,>

Comments are closed.