Как добавить 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,

  1. Собирает утверждения, которыми управляет MembershipReboot (включая утверждения в UserClaims Таблица).
  2. Получить пользовательские претензии по телефону 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 создается, он будет включать в себя любые претензии, которые вы возвращаете из своего пользовательского картографа.

Другие вопросы по тегам