Аутентификация основана на динамической схеме заголовка авторизации в не MVC Asp.Net Core 2.x - PullRequest
0 голосов
/ 08 марта 2019

Я создаю API, который не использует MVC , а скорее использует промежуточное программное обеспечение.Должна быть возможность проходить проверку подлинности как по базовой, так и по схеме (Jwt) Bearer (мне известны недостатки безопасности Basic Auth)

Я легко могу зарегистрировать обе схемы в службах, но app.UseAuthentication middlewareбудет пытаться выполнить аутентификацию только по схеме по умолчанию (это сделано намеренно и описано в документации).Разрешение нескольких схем для одной и той же конечной точки может быть выполнено в MVC с помощью фильтра авторизации, но я не смог найти простое решение для сценариев, отличных от MVC

Я вижу, что многие люди пытаются достичь того же: https://github.com/aspnet/AspNetCore/issues/3620 https://github.com/aspnet/Security/issues/1469

1 Ответ

1 голос
/ 08 марта 2019

В итоге я определил простое промежуточное ПО на основе https://github.com/aspnet/Security/issues/1469#issuecomment-334982498

app.Use(async (context, next) =>
{
    var authHeader = AuthenticationHeaderValue.Parse(context.Request.Headers[HeaderNames.Authorization]);
    var schemeName = authHeader?.Scheme ?? string.Empty;

    var provider = context.RequestServices.GetService<IAuthenticationSchemeProvider>();
    var scheme = await provider.GetSchemeAsync(schemeName);

    if (scheme != null)
    {
        var result = await context.AuthenticateAsync(scheme.Name);
        if (result.Succeeded)
        {
            context.User = result.Principal;
        }
    }

    await next.Invoke();
});

Начиная с 2.1, можно добавить политику настраиваемой схемы и переадресовать схему по умолчанию с помощью AuthenticationSchemeOptions.ForwardDefaultSelector, см .: https://github.com/aspnet/Security/issues/1469#issuecomment-399239254

...