Мой веб-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?
Я искал много сообщений и не нашел ни одного сценария, который бы соответствовал тому, что я пытаюсь сделать.