Пользовательские свойства удостоверения ASP.NET Core MVC

Я пытаюсь создать веб-сайт в ASP.NET Core MVC и использую библиотеку Microsoft.Identity. У меня есть настраиваемое свойство в моем классе User (ApplicationUser), которое называется Token. Я хочу создать файл cookie при входе в систему с этим токеном. Поэтому мне нужно вызвать некоторую функцию, которая позволяет мне получить атрибут Token от вошедшего в систему пользователя (через UserManager или что-то еще. Это должен быть пользователь, который вошел в систему.)

Я поискал в Интернете и нашел несколько решений, создав собственный Factory и затем добавив его в startup.cs Вот так. Но я не могу найти или увидеть способ доступа к собственности. User.Identity.GetToken() не работает.

Вот моя кастомная фабрика:

 public class CustomUserIdentityFactory : UserClaimsPrincipalFactory<User, IdentityRole>
    {
        public CustomUserIdentityFactory(UserManager<User> userManager, RoleManager<IdentityRole> roleManager, IOptions<IdentityOptions> optionsAccessor) : base(userManager, roleManager, optionsAccessor)
        {}

        public override async Task<ClaimsPrincipal> CreateAsync(User user) {
            var principal = await base.CreateAsync(user);

            if(!string.IsNullOrWhiteSpace(user.Token)) {
                ((ClaimsIdentity)principal.Identity).AddClaims(new[] {
                    new Claim(ClaimTypes.Hash, user.Token)
                });
            }

            return principal;
        }
    }

Вот настройка в моем Startup.cs

services.AddScoped<IUserClaimsPrincipalFactory<User>, CustomUserIdentityFactory>();

Итак, короче: я пытаюсь получить доступ к настраиваемому свойству идентификации и нашел способ добавить его в UserManager, но не могу найти способ получить к нему доступ.


person Finley Siebert    schedule 10.07.2017    source источник
comment
Я нашел обходной путь, установив файл cookie после входа пользователя в систему, выбрав пользователя с помощью (await _userManager.GetUserAsync(HttpContext.User)).Token   -  person Finley Siebert    schedule 11.07.2017


Ответы (1)


Ваш CustomUserIdentityFactory добавляет утверждения для вошедшего в систему пользователя, так что утверждения будут добавлены в файл cookie, к которому можно получить доступ с помощью "User.Claims", указав тип вашего утверждения.

Предположим, ваш тип претензии - "http://www.example.com/ws/identity/claims/v1/token "

Измените свой код, как показано ниже, переопределив метод CreateAsync, используя свой собственный тип утверждения.

public override async Task<ClaimsPrincipal> CreateAsync(User user) {
            var principal = await base.CreateAsync(user);
            var tokenClaimType = "http://www.example.com/ws/identity/claims/v1/token"

            if(!string.IsNullOrWhiteSpace(user.Token)) {
                ((ClaimsIdentity)principal.Identity).AddClaims(new[] {
                    new Claim(tokenClaimType, user.Token)
                });
            }

            return principal;
        }

Как получить доступ к токену в составе "User.Claims"

var tokenClaimType = "http://www.example.com/ws/identity/claims/v1/token"
var token = User.Claims.Where(claim => claim.Type == tokenClaimType);

Надеюсь это поможет.

person DSR    schedule 11.07.2017