Создание претензий личности в Идентичности 3

Visual Studio 2015 использует строительные леса UserManager<TUser> который не может быть использован для создания ClaimsIdentity, У кого-нибудь есть рабочий пример как это сделать?

Леса VS2015 выдают ошибки:

public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
{
    // Note the authenticationType must match the one 
    // defined in CookieAuthenticationOptions.AuthenticationType
    var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);

    // Add custom user claims here
    return userIdentity;
}

NB: я добавил свойства ApplicationUser которые не конфликтуют с IdentyUser,

1 ответ

Решение

UserManager изменился в версии MVC6. Вам нужно будет изменить свой код...

public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager) {
    var authenticationType = "Put authentication type Here";
    var userIdentity = new ClaimsIdentity(await manager.GetClaimsAsync(this), authenticationType);

    // Add custom user claims here
    return userIdentity;
}

Для ядра Dotnet ответ изменился, здесь и здесь оба автора заявляют об использованииUserClaimsPrincipalFactory<ApplicationUser>это реализация по умолчанию для ядра 2.2. В первой статье говорится, что искомый метод переместился. Однако, как указано, вы должны зарегистрировать свою реализациюUserClaimsPrincipalFactoryв таких сервисах и ниже приведен пример реализации класса. Пожалуйста, примите во внимание, что мы должны зарегистрироватьсяMyUserClaimsPrincipalFactoryпоэтому наша коллекция сервисов знает, где их найти. Что означает в конструктореSignInManager<ApplicationUser> это также относится к IUserClaimsPrincipalFactory<ApplicationUser> но сервис решит это:

services
.AddIdentity<ApplicationUser, ApplicationRole>()              
.AddClaimsPrincipalFactory<MyUserClaimsPrincipalFactory>() <======== HERE

services.AddScoped<IUserClaimsPrincipalFactory<ApplicationUser>, MyUserClaimsPrincipalFactory>();

А вот и класс ниже:

public class MyUserClaimsPrincipalFactory : UserClaimsPrincipalFactory<ApplicationUser>
{
    public MyUserClaimsPrincipalFactory(UserManager<ApplicationUser> userManager, 
        IOptions<IdentityOptions> optionsAccessor)
        : base(userManager, optionsAccessor)
    {
    }

    protected override async Task<ClaimsIdentity> GenerateClaimsAsync(ApplicationUser user)
    {
        var identity = await base.GenerateClaimsAsync(user);
        identity.AddClaim(new Claim("ContactName", "John Smith"));
        return identity;
    }
}
Другие вопросы по тегам