Как добавить UserClaims в ClaimsPrincipal
У меня есть настройка проекта C# .NET с использованием Entity Framework, MembershipReboot и IdentityServer3.
Я смотрю на базу данных и вижу UserClaims
Таблица. Внутри этой таблицы я добавил несколько заявок, используя MembershipReboot AddClaim
метод.
Требования от UserClaims
таблицы как-то добавляются к ClaimsPrincipal
, Я вижу это, когда отправляю запрос Controller
, В контроллерах ActionResult
Метод у меня есть следующие несколько строк кода:
var claimsPrincipal = User as ClaimsPrincipal;
if (claimsPrincipal != null)
{
var userClaims = claimsPrincipal.Claims;
В этом примере userClaims
будет содержать претензии от MembershipReboots UserClaims
Таблица.
Подобным образом я хотел бы добавить некоторые дополнительные претензии к ClaimsPrincipal
без использования таблицы UserClaims. Идея состоит в том, что если пользователь является членом группы, он будет наследовать заявки, связанные с этой группой. Я создал отдельную таблицу, в которой храню эти групповые заявки, но у меня возникают проблемы с добавлением этих заявок в ClaimsPrincipal
,
Я смотрел на SamAuthenticationService
в MembershipReboot, однако я не уверен, что я смотрю в нужном месте.
Сможет ли кто-нибудь, более знакомый с MembershipReboot и IdentityServer, указать мне правильное направление?
1 ответ
После еще нескольких копаний я обнаружил, где собраны претензии и добавлены в ClaimsPrincipal
в MembershipReboot.
ClaimsPrincipal
устанавливается в пределах Sign In
метод в AuthenticationService
, SignIn
Метод делает следующие вещи перед созданием ClaimsPrincipal
,
- Собирает утверждения, которыми управляет MembershipReboot (включая утверждения в
UserClaims
Таблица). - Получить пользовательские претензии по телефону
UserAccountService.MapClaims
UserAccountService.MapClaims
метод выполняет MapClaimsFromAccount<TAccount>
команда. Именно в этот момент вы можете зарегистрировать обработчик в MembershipReboot для запуска настраиваемого сопоставления утверждений. Ваш картограф будет выполнен, а претензии, которые вы вернете, будут добавлены к ClaimsPrincipal
,
Мне потребовалось некоторое время, чтобы найти это, но этот выпуск GitHub очень помог. Я скопирую код ниже.
По сути, что вы делаете, это создать CustomMapper
который реализует ICommandHandler<MapClaimsFromAccount<CustomUserAccount>>
, куда CustomUserAccount
ваш собственный класс, который расширяется RelationalUserAccount
,
Таможенный Заявитель Mapper
public class CustomClaimsMapper : ICommandHandler<MapClaimsFromAccount<CustomUserAccount>>
{
public void Handle(MapClaimsFromAccount<CustomUserAccount> cmd)
{
cmd.MappedClaims = new System.Security.Claims.Claim[]
{
new System.Security.Claims.Claim(ClaimTypes.GivenName, cmd.Account.FirstName),
new System.Security.Claims.Claim(ClaimTypes.Surname, cmd.Account.LastName),
};
}
}
Это код, который вы использовали бы для сопоставления ваших собственных утверждений. Заявления, приведенные выше, являются лишь примером. Эти претензии могут быть все, что вам нужно для вашего приложения.
Регистрация Mapper
public static MembershipRebootConfiguration<CustomUserAccount> config;
static MembershipRebootUserServiceFactory()
{
config = new MembershipRebootConfiguration<CustomUserAccount>();
//Add a handler for the Custom User Account Type
config.AddCommandHandler(new CustomClaimsMapper());
}
Здесь вы бы добавили обработчик команд для своего пользовательского преобразователя.
Теперь, когда ClaimsPrincipal
создается, он будет включать в себя любые претензии, которые вы возвращаете из своего пользовательского картографа.