Как получить роли пользователя в ASP.NET Identity - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть пользовательское хранилище, определенное следующим образом:

public class ExternalUserStore<T> : IUserStore<T>, IUserPasswordStore<T>, IUserRoleStore<T> where T : Models.ApplicationUser

Один из методов:

public Task<IList<string>> GetRolesAsync(T user)

Этот метод вызывается удостоверением ASP.NET в пользовательском OAuthProvider GrantResourceOwnerCredentialsметод, таким образом:

        var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>();

        ApplicationUser user = await userManager.FindAsync(context.UserName, context.Password);

        if (user == null)
        {
            context.SetError("invalid_grant", "El nombre de usuario o la contraseña no son correctos.");
            return;
        }

        var roles = await userManager.GetRolesAsync(user.Id);

Моя реализация метода GetRolesAsync такова:

    public Task<IList<string>> GetRolesAsync(T user)
    {
        IList<string> roles = new List<string>();

        foreach (var userRole in user.Roles)
        {
            // Here I need to create ApplicationRole objects
        }

        return Task.FromResult(roles);
    }

Я думаю, что мне нужно перебрать user.Roles, а поскольку user.Roles - это списокобъект со свойствами UserId и RoleId, мне нужно найти роль по идентификатору, а затем добавить ее в список.

Однако user.Roles пуст и это очевидно, так как я не заполняю какие-либороль для пользователя.

Вопрос в том, как его заполнить.

Это метод FindByIdAsync пользователя, который заполняет информацию о пользователе:

    public Task<T> FindByIdAsync(string userId)
    {
        using (var db = Helpers.DataRetrieval.GetConnector())
        {
            var usuarioStored = db.GetUsuarioPorId(userId);

            if (usuarioStored == null)
                return Task.FromResult((T)null);

            var appUser = PopulateUserData(usuarioStored);

            return Task.FromResult((T)appUser);
        }
    }

    private Models.ApplicationUser PopulateUserData(MiddleTier.Models.IUsuario usuario)
    {
        var appUser = new Models.ApplicationUser()
        {
            Id = usuario.Id.ToString(),
            UserName = usuario.Login,
            Email = usuario.Email,
            EmailConfirmed = true,
            PasswordHash = usuario.PasswordHash,
            SecurityStamp = usuario.PasswordSalt,
            PhoneNumber = usuario.Telefono,
            PhoneNumberConfirmed = !String.IsNullOrWhiteSpace(usuario.Telefono),
            TwoFactorEnabled = false,
            LockoutEnabled = usuario.Bloqueado
        };

        return appUser;
    }

Как видите, я могу в appUserназначить свойство Roles, но я столкнулся с той же проблемой ..... Roles - это список IdentityUserRoles, который имеет 2 свойства: UserId и RoleId.

Что я могу сделать?

...