У меня возникла проблема при изучении Web Api на Net Core 2.0 Я написал свой собственный атрибут авторизации
public class BasicAuthAttribute : AuthorizeAttribute, IAuthorizationFilter
{
public void OnAuthorization(AuthorizationFilterContext context)
{
var actionContext = context.HttpContext;
var authService = BasicController.GetService<IAuthenticationService>();
var authKey = actionContext.Request.Headers["Authorization"].ToString();
if (authKey == string.Empty || !authService.ApiKeyProperly(authKey))
{
actionContext.Response.Redirect("~/unathorized.html");
}
}
}
и я использую его в каком-то действии:
public class UsersController : BasicController
{
[BasicAuth]
[HttpGet]
public IActionResult Get()
{
IUsersService usersService = GetService<IUsersService>();
var users = usersService.QueryUsers().ToArray();
return Ok(users);
}
}
Мой authService проверяет правильность ключа, и при отладке я перехожу к последней строке BasicAuthAttributeClass (авторизация прошла нормально), но когда я нажимаю «продолжить», я получаю 500 кроме того, чтобы вернуться к ma UserController. Он не переходит к методу GET после выхода из класса атрибутов.
Что я сделал не так? Я что-то упускаю?
Я получаю сообщение об ошибке:
InvalidOperationException: No authenticationScheme was specified, and there was no DefaultChallengeScheme found
а какую схему добавить? если я сделаю это в своем Startup.cs (WebApi)
services.AddAuthentication();
что я должен поставить здесь? я не хочу использовать файлы cookie и т. д. я просто хочу изменить поведение своих методов - если у него есть атрибут (basicauth) просто проверьте ключ. если ключ в порядке -> вернуться к методу
Я сделал немного некрасиво, но для меня удовлетворительный результат;)
public class BasicAuthAttribute :Attribute, IAuthorizationFilter
{
public void OnAuthorization(AuthorizationFilterContext context)
{
var actionContext = context.HttpContext;
var authService = BasicController.GetService<IAuthenticationService>();
var authKey = actionContext.Request.Headers["Authorization"].ToString();
if (authKey == string.Empty || !authService.ApiKeyProperly(authKey))
{
context.Result = new UnauthorizedResult();
}
}
}
поэтому я не использую AuthorizeAttribute, но я получаю от Atrribute а затем, если context.result получит какой-то результат никакое действие не будет вызвано после выхода из метода