Я пытаюсь изучить 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 () правильный.