У нас есть проект Net Core 2.1 API. Мы используем заголовки запроса для получения ключа API, который мы проверяем по нашей базе данных, чтобы увидеть, соответствует ли он одному из ожидаемых ключей. Если это так, мы разрешаем выполнение запроса, в противном случае мы хотим отправить обратно неавторизованный ответ.
наш startup.cs
services.AddAuthorization(options =>
{
options.AddPolicy("APIKeyAuth", policyCorrectUser =>
{
policyCorrectUser.Requirements.Add(new APIKeyAuthReq());
});
});
services.AddSingleton<Microsoft.AspNetCore.Authorization.IAuthorizationHandler, APIKeyAuthHandler>();
Наш APIKeyAuthHandler.cs
public class APIKeyAuthReq : IAuthorizationRequirement { }
public class APIKeyAuthHandler : AuthorizationHandler<APIKeyAuthReq>
{
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, APIKeyAuthReq requirement)
{
if (context == null)
throw new ArgumentNullException(nameof(context));
if (requirement == null)
throw new ArgumentNullException(nameof(requirement));
var httpContext = context.Resource as Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext;
var headers = httpContext.HttpContext.Request.Headers;
if (headers.TryGetValue("Authorization", out Microsoft.Extensions.Primitives.StringValues value))
{
using (DBContext db = new DBContext ())
{
var token = value.First().Split(" ")[1];
var login = db.Login.FirstOrDefault(l => l.Apikey == token);
if (login == null)
{
context.Fail();
httpContext.HttpContext.Response.StatusCode = 403;
return Task.CompletedTask;
} else
{
httpContext.HttpContext.Items.Add("CurrentUser", login);
context.Succeed(requirement);
return Task.CompletedTask;
}
}
}
}
}
и наш controller.cs
[Route("api/[controller]/[action]")]
[Authorize("APIKeyAuth")]
[ApiController]
public class SomeController : ControllerBase
{
}
Все работает нормально, когда существует действительный ключ, но когда его нет, возникает внутренняя ошибка 500 для No authenticationScheme вместо 403.
Мы относительно плохо знакомы с сетевым ядром (пришедшим из Net Framework / Forms Authentication), поэтому, если есть более точный способ выполнения такого рода аутентификации, пожалуйста, дайте мне знать.
Сообщение об ошибке:
InvalidOperationException: не была указана схема проверки подлинности, и схема DefaultChallengeScheme не найдена. Microsoft.AspNetCore.Authentication.AuthenticationService.ChallengeAsync (контекст HttpContext, строковая схема, свойства AuthenticationProperties)
[Authorize("APIKeyAuth")]
- person davidfowl   schedule 12.09.2018