Что такое претензии? Когда вы их используете?
Проще говоря, утверждение — это структура данных, которая содержит значение ключа.
Ключ — это любая строка, которая однозначно идентифицирует что-то (называемое ClaimType), а значение — это ее значение. Вот и все.
Но претензии соответствуют идентификатору пользователя.
Претензии содержат информацию о Пользователе, который делает запрос на информацию, или о Клиенте, который делает вызов.
В ASP.NET Core утверждения устанавливаются промежуточным программным обеспечением проверки подлинности.
Когда пользователь или клиент делает запрос к веб-API вместе с токеном JWT, ПО промежуточного слоя аутентификации анализирует токен и проверяет подлинность.
Если проверка прошла успешно, он десериализует раздел полезных данных токена, который является объектом JSON, и создает коллекцию утверждений со свойствами JSON полезных данных в качестве ключевых значений.
Затем из коллекции утверждений создается ClaimsIdentity, а затем объект Principal.
Этот субъект привязан к пользовательскому контексту, который будет доступен, когда мы получим к нему доступ в наших методах контроллера или в любом месте после промежуточного программного обеспечения аутентификации.
Иерархия доступа примерно такая:
HttpContext -> User -> Identity -> Claims -> Claim(ClaimType, ClaimValue)
Коллекция Claims разработана как IEnumerable объектов Claim, а не как Dictionary. Почему?
Это связано с тем, что существует вероятность того, что типы утверждений могут дублироваться.
Например, если у пользователя есть несколько ролей в системе, то в документе JSON у вас будет несколько свойств ключевой роли.
Если бы коллекция Claims была словарем, она бы не поддерживала этот сценарий.
Следовательно, вы обычно выполняете цикл или применяете запросы Linq к коллекции и извлекаете необходимую информацию о заявке запрашивающего пользовательского контекста.
var rolesOfAuthenticatedUser = _httpContextAccessor.HttpContext.User.Identity.Claims.Where(_ => _.Type == "Role").Select(_ => _.Value);
Для методов модульного тестирования, использующих Claims, вы можете смоделировать IHttpContextAccessor и настроить свойство Claims с помощью упомянутой выше иерархии.
Прочтите мою статью о том, как реализовать авторизацию с помощью .NET — https://codingramen.com/blog/how-to-authorize-requests-in-asp-net-core-web-api/
Подпишитесь на мою рассылку и получайте уведомления — https://codingramen.substack.com/