ClaimsPrincipal и объекты Claim

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7

Последнее обновление: 13.12.2019

В прошлой теме был рассмотрен объект HttpContext.User, который представляет интерфейс IPrincipal. А у этого объекта есть свойство Identity, которое представляет интерфейс IIdentity. Для обоих этих интерфейсов ASP.NET Core предоставляет реализации по умолчанию - классы ClaimsPrincipal и ClaimsIdentity. То есть свойство User (HttpContext.User) фактически представляет объект ClaimsPrincipal.

Ключевым моментом этих двух классов является то, что они позволяют работать с объектами claim.

Объекты claim представляют некоторую информацию о пользователе, которую мы можем использовать для авторизации в приложении. Например, у пользователя может быть определенный возраст, город, страна проживания, любимая музыкальная группа и прочие признаки. И все эти признаки могут представлять отдельные объекты claim. И в зависимости от значения этих claim мы можем предоставлять пользователю доступ к тому или иному ресурсу. Таким образом, claims представляют более общий механизм авторизации нежели стандартные логины или роли, которые привязаны лишь к одному определенному признаку пользователя.

Каждый объект claim представляет класс Claim, который определяет следующие свойства:

  • Issuer: "издатель" или название системы, которая выдала данный claim

  • Subject: возвращает информацию о пользователе в виде объекта ClaimsIdentity

  • Type: возвращает тип объекта claim

  • Value: возвращает значение объекта claim

Так в позапрошлой теме для создания аутентификационных куки также использовался объект Claim:

var claims = new List<Claim>
{
    new Claim(ClaimsIdentity.DefaultNameClaimType, userName)
};

Для создания claima ему в конструктор передается тип и значения. Тип ClaimsIdentity.DefaultNameClaimType фактически представляет логин. А userName, в данном случае будет представлять значение, которое затем мы сможем получить через выражение User.Identity.Name

Для работы с объектами Claim в классе ClaimsPrincipal есть следующие свойства и методы:

  • Identity: возвращает объект ClaimsIdentity, который реализует интерфейс IIdentity и представляет текущего пользователя

  • FindAll(type) / FindAll(predicate): возвращает все объекты claim, которые соответствуют определенному типу или условию

  • FindFirst(type) / FindFirst(predicate): возвращает первый объект claim, который соответствуют определенному типу или условию

  • HasClaim(type, value) / HasClaim(predicate): возвращает значение true, если пользователь имеет claim определенного типа с определенным значением

  • IsInRole(name): возвращает значение true, если пользователь принадлежит роли с названием name

С помощью объекта ClaimsIdentity, который возвращается свойством User.Identity, мы можем управлять объектами claim у текущего пользователя. В частности, класс ClaimsIdentity определяет следующие свойства и методы:

  • Claims: свойство, которое возвращает набор ассоциированных с пользователем объектов claim

  • AddClaim(claim): добавляет для пользователя объект claim

  • AddClaims(claims): добавляет набор объектов claim

  • FindAll(predicate): возвращает все объекты claim, которые соответствуют определенному условию

  • HasClaim(predicate): возвращает значение true, если пользователь имеет claim, соответствующий определенному условию

  • RemoveClaim(claim): удаляет объект claim

Например, опять же в позапрошлой теме все эти классы применялись для аутентификации пользователя:

var claims = new List<Claim>
{
    new Claim(ClaimsIdentity.DefaultNameClaimType, user.Email),
};
// создаем объект ClaimsIdentity
ClaimsIdentity id = new ClaimsIdentity(claims, "ApplicationCookie", 
	ClaimsIdentity.DefaultNameClaimType, ClaimsIdentity.DefaultRoleClaimType);
// установка аутентификационных куки
await HttpContext.SignInAsync("Cookies", new ClaimsPrincipal(id));

Для создания объекта ClaimsIdentity в его конструктор передается набор claim, тип аутентификации (ApplicationCookie), тип для claima, представляющего логин, и тип для claima, представляющего роль.

Созданный объект ClaimsIdentity передается в конструктор ClaimsPrincipal. И фактически этот объект ClaimsPrincipal и будет представлять то, что мы потом в любом контроллере сможем получить через HttpContext.User.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850