métodos de autenticación múltiples en asp.Net núcleo 2.2

Pregunta hecha: hace 10 meses Ultima actividad: hace 10 meses
up 1 down

¿Hay una manera de utilizar la autenticación de JWT portador y un método de autenticación personalizado en el núcleo .net? Quiero que todas las acciones por defecto a JWT, salvo en unos pocos casos en que quiero usar un encabezado de autenticación personalizado.

1 respuesta

Quizás tu proyecto necesite tarjetas de vector libre. Nuestro sitio tiene mapas para todos los países.

Publicación patrocinada

up 3 down accepted

Finalmente me di cuenta de cómo hacerlo. En este ejemplo se utiliza la autenticación de JWT por defecto y autenticación personalizada en ciertos casos raros. Tenga en cuenta, por lo que he leído, Microsoft parece desalentar a escribir su propia autenticación. Por favor, use bajo su propio riesgo.

En primer lugar, añadir este código al método startup.cs ConfigureServices para asegurar que la autenticación obtiene aplicado a nivel mundial.

services.AddMvc(options => 
    {
        var policy = new AuthorizationPolicyBuilder()
            .RequireAuthenticatedUser()
            .Build();
        options.Filters.Add(new AuthorizeFilter(policy));
    })

A continuación, añadir esto a configurar los esquemas que desea utilizar (en nuestro caso JWT y Personalizado).

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    // Jwt Authentication
    .AddJwtBearer(options =>
    {
        options.Audience = ".......";
        options.Authority = "https://cognito-idp.us-east-1.amazonaws.com/us-east-1_...";
    })
    // Custom auth
    .AddScheme<CustomAuthOptions, 
        CustomAuthHandler>(CustomAuthOptions.DefaultScheme, options => { });

A continuación, cree una clase para mantener sus opciones de autenticación personalizados:

public class CustomAuthOptions : AuthenticationSchemeOptions
{
    public const string Scheme = "custom auth";
    public const string CustomAuthType = "custom auth type";
}

Por último, agregar un controlador de autenticación para implementar la lógica de autenticación personalizado.

public class CustomAuthHandler : AuthenticationHandler<CustomAuthOptions>
{
    public CustomAuthHandler(
        IOptionsMonitor<CustomAuthOptions> options, 
        ILoggerFactory logger, 
        UrlEncoder encoder, 
        ISystemClock clock) : base(options, logger, encoder, clock)
    {
    }

    protected override Task<AuthenticateResult> HandleAuthenticateAsync()
    {
        // Auth logic goes here
        if (!Request.Headers....) 
        {
            return Task.FromResult(AuthenticateResult.Fail("Authentication Failed."));
        }

        // Create authenticated user
        ClaimsPrincipal principal = .... ;

        List<ClaimsIdentity> identities = 
            new List<ClaimsIdentity> {
                new ClaimsIdentity(CustomAuthOptions.CustomAuthType)};

        AuthenticationTicket ticket = 
            new AuthenticationTicket(
                new ClaimsPrincipal(identities), CustomAuthOptions.Scheme);

        return Task.FromResult(AuthenticateResult.Success(ticket));
    }
}

Por último, para mantenerlo todo junto, añadir un atributo de autorización a las acciones que desea utilizar la autorización personalizada en.

[HttpGet]
[Authorize(AuthenticationSchemes = CustomAuthOptions.Scheme)]
public HttpResponseMessage Get()
{
    ....
}

Ahora autenticación JWT automáticamente obtener aplicado a todas las acciones, y la autenticación personalizada se agregarán sólo las acciones con el atributo Autorizar establecido en el esquema personalizado.

Espero que esto ayude a alguien.