Asp.Net Core 2.1 - авторизация на основе содержимого в запросе - PullRequest
0 голосов
/ 17 октября 2018

Я предоставляю конечную точку для интеграции с третьей стороной, и они требуют от меня авторизации их запросов к моей конечной точке на основе ключа, переданного в публикуемом теле.Затем мой код должен подтвердить, что переданный ключ соответствует некоторому заданному значению на моей стороне.Поступающая модель будет выглядеть примерно так:

public class RequestBase
{
    public string ApiKey { get; set; }
    ...
}

Изучение вариантов Авторизация в ASP.NET Core Я не вижу совпадения с тем, что я пытаюсь сделать.Я думаю, что пользовательский AuthorizeAttribute из этот вопрос будет работать, но мне не повезло, и я получаю 401 независимо от того, что я делаю.Вот что у меня есть:

[AttributeUsage(AttributeTargets.Class)]
public class MyAuthorizeAttribute : AuthorizeAttribute, IAuthorizationFilter
{
    private static IEnumerable<string> _apiKeys = new List<string>
        {
            "some key... eventually will be dynamic"
        };

    public void OnAuthorization(AuthorizationFilterContext context)
    {
        var req = context.HttpContext.Request;
        req.EnableRewind();

        using (var reader = new StreamReader(req.Body, Encoding.UTF8, true, 1024, true))
        {
            var bodyStr = reader.ReadToEnd();
            var isAuthorized = _apiKeys.Any(apiKey => bodyStr.Contains(apiKey));
            if (!isAuthorized)
            {
                context.Result = new StatusCodeResult((int)System.Net.HttpStatusCode.Forbidden);
                return;
            }
        }

        req.Body.Position = 0;
    }
}

Когда ключ не найден в теле, возвращается 403, как и ожидалось.Однако, когда ключ найден, результат, который я получаю, все равно остается 401. Почти кажется, что вызывается base.OnAuthorization.У меня есть другие конечные точки, которые используют стандартный AurhorizeAttribute.Они работают, как и ожидалось, только если я передаю JWT.

Вопросы:

  1. Я на правильном пути с пользовательским атрибутом AuthorizeAttribute или естьлучший способ?
  2. Если клиент AuthorizeAttribute - правильный путь ... что мне не хватает?

Цените любую помощь!

1 Ответ

0 голосов
/ 18 октября 2018

Для использования вашей собственной логики авторизации с IAuthorizationFilter не следует использовать с AuthorizeAttribute, которая проверит Аутентификацию с использованием схемы аутентификации по умолчанию.

Попробуйте изменить AuthorizeAttribute на Attribute.

[AttributeUsage(AttributeTargets.Class)]
public class KeyAuthorizeAttribute : Attribute, IAuthorizationFilter
{
...