Как лучше всего реализовать простую проверку учетных данных JWT для данных, передаваемых на мой контроллер - PullRequest
0 голосов
/ 26 марта 2019

Мой веб-API ASPNetCore использует JWT (Json Web Tokens) для аутентификации. Маркер JWT имеет внешний и внутренний идентификатор пользователя. Наличие этих идентификаторов в JWT меня не беспокоит, так как JWT не может быть подделано или они становятся недействительными, а внутренний идентификатор бесполезен вне системы. Конечно, пароль отсутствует в содержимом JWT.

В JWT внешний идентификатор пользователя становится пользователем System.Security.Claims.ClaimType.Name. Внутренний идентификатор устанавливается как значение JwtRegisteredClaimName.UniqueName.

Когда выполняются вызовы веб-API, хорошо, что атрибут атрибута [Authorize] гарантирует, что пользователь прошел аутентификацию и имеет действующий в настоящий момент JWT. Меня беспокоит то, что, как только пользователь вошел в систему, существует возможность взлома с помощью веб-API, отправки внешних или внутренних идентификаторов пользователей в качестве критериев, которые не соответствуют аутентифицированному в настоящее время пользователю. Некоторые веб-методы в контроллерах принимают внутренний идентификатор пользователя как часть публикуемого запроса, например, вызов для сохранения информации о пользователе имеет внутренний идентификатор пользователя внутри, используемый в качестве ключа для сохранения данных. Я должен быть уверен, что аутентифицированный пользователь совпадает / совпадает с пользователем, данные которого сохраняются через Web API.

Мой вопрос: как и где лучше всего реализовать эту защиту на уровне данных в моем веб-интерфейсе? Политики, похоже, не могут применяться к передаваемым данным. Фильтры авторизации, похоже, не имеют доступа ни к телу сообщения, ни к каким-либо привязкам данных. Фильтры действий ( Microsoft.ASPNetCore.MVC.Filters ) запускаются позже, но, похоже, на самом деле они не предназначены для этого. Кроме того, как вы получаете доступ к телу сообщения, которое было размещено внутри фильтра действий? Или я всегда должен убедиться, что идентификатор пользователя передается в методы в качестве параметра с непротиворечивым именем, к которому я могу получить доступ через ActionExecutingContext.ActionArguments?

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

1 Ответ

1 голос
/ 27 марта 2019

Вы всегда можете использовать Промежуточное программное обеспечение для перехвата вызова, когда объект Response заполнен, см. Пример кода здесь и здесь .

Фильтры авторизации также могут читать тело запроса с помощью EnableRewind:

public class ReadableBodyStreamAttribute : AuthorizeAttribute, IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationFilterContext context)
    {
        var request = context.HttpContext.Request;
        context.HttpContext.Request.EnableRewind();
        using (var stream = new StreamReader(request.Body))
        {
            stream.BaseStream.Position = 0;
          var  requestBody = stream.ReadToEnd();
        }

    }
}

Также работает в фильтрах действий:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class ReadableBodyStreamAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext actionContext)
    {
        var request = actionContext.HttpContext.Request;
        var route = request.Path.HasValue ? request.Path.Value : "";
        var requestHeader = request.Headers.Aggregate("", (current, header) => current + $"{header.Key}: {header.Value}{Environment.NewLine}");
        var requestBody = "";
        request.EnableRewind();
        using (var stream = new StreamReader(request.Body))
        {
            stream.BaseStream.Position = 0;
            requestBody = stream.ReadToEnd();
        }
        if (...)
        {
            var wrongResult = new { error = "Wrong parameters" };
            actionContext.Result = new JsonResult(wrongResult);
        }

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