Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7
В прошлой теме был рассмотрен объект 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
.