AspnetCore Многократная аутентификация и использование AddAuthorization / AddAuthentication / UseAuthentication - PullRequest
0 голосов
/ 24 сентября 2019

Я пытаюсь изучить ASPNetCore 2.2
Я не понимаю, как работают цепочки аутентификации.

Пример: Startup.cs

public void ConfigureServices(IServiceCollection services) {
                services.AddMvcCore()
                        .AddAuthorization();                // Note 1

                services.AddAuthentication(options => {     // Note 2
                      options.DefaultAuthenticateScheme = ApiKeyAuthenticationOptions.DefaultScheme;
                      options.DefaultChallengeScheme    = ApiKeyAuthenticationOptions.DefaultScheme;})
                .AddJwtBearer(x => {
                              x.RequireHttpsMetadata = false;
                              x.SaveToken            = true;                                      
                              x.TokenValidationParameters = tvp;})
                .AddApiKeySupport(options => { });
    }



    public void Configure(IApplicationBuilder app, IHostingEnvironment env) {
        app.UseStatusCodePages()
           .UseResponseCompression()
           //.UseAuthentication()                            // NOTE 3
           .UseMvc();
    }

ApiKeyHandler.cs

public class ApiKeyHandler  : AuthenticationHandler<ApiKeyAuthenticationOptions>
    protected override async Task<AuthenticateResult> HandleAuthenticateAsync() {
        log.Debug("Checking API key");

        // No API KeyProvided. Pass to next auth handler (JWT)
        if (!Request.Headers.TryGetValue(ApiKeyHeaderName, out var apiKeyHeaderValues)) {
            return AuthenticateResult.NoResult();
        }

        if (checkAuthHeader(foo)) {
            ticket = createTicket(foo);
            return AuthenticateResult.Success(ticket);
        }
}

TestController.cs

[Authorize]
[ApiController]
public class TestApiController : Controller {

    [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme + "," + ApiKeyAuthenticationOptions.DefaultScheme)]
    [HttpGet("api-jwt")]
    public IActionResult APIAndJWT() {
        var message = $"API and JWT !!! {nameof(APIAndJWT)}";
        return new ObjectResult(message);
    }



    [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
    [HttpGet("only-jwt")]
    public IActionResult OnlyJWT() {
        var message = $"JWT {nameof(OnlyJWT)}";

        return new ObjectResult(message);
    }



    [Authorize(AuthenticationSchemes = ApiKeyAuthenticationOptions.DefaultScheme)]
    [HttpGet("only-api")]
    public IActionResult OnlyAPI() {
        var message = $"            API       {nameof(OnlyAPI)}";

        return new ObjectResult(message);
    }
 }

Хорошо, TestApi очень прост.Я хочу вызвать некоторую конечную точку, используя аутентификацию JWT или ключ API.Другие конечные точки могут вызываться как с аутентификацией.
Существует три метода.Один использует только аутентификацию JWT, один - только аутентификацию API, а другой - может использовать аутентификацию JWT или API.
Я не знаю, как работают эти методы:

  • AddAuthorization () // Примечание 1
  • AddAuthentication (...) // Примечание 2
  • UseAuthentication () // Примечание 3

Ну, без AddAuthorization () похоже, что мой атрибут [Authorize] не используется, поэтому я имею свободный доступ ко всем API. BAD .В MSDN AddAuthorization (), кажется, включает политику, которую я не использую.
I должен использовать AddAuthorization () для управления простым доступом к API?

AddAuthentication () это легко.Он просто настраивает мои обработчики аутентификации (JWT и пользовательский обработчик API)

UseAuthentication В этом проблема.Я думаю, что это разрешает промежуточное программное обеспечение, добавленное с помощью AddAuthentication (...) // Примечание 2

Мой вопрос: правильно, что каждый маршрут создает новый экземпляр ApiKeyHandler?
Например, в маршруте /only-jwt Я указываю только JWT authschema, но ApiKeyHandler всегда создается / вызывается.

REMOVING Вместо этого используйтеAuthentication (), чтобы получить те же результаты, то есть аутентифицированные маршруты, но без создания бесполезного ApiKeyHandler, когда это не требуется ( / only-jwt ).
Чтопуть соответствия?

Я думаю, что порядок AddMvc () / AddAuthorization () - AddMvc / UseAuthentication () правильный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...