如何在ASP.NET Identity中获得用户角色

时间:2018-11-20 22:34:59

标签: c# asp.net asp.net-identity owin

我有一个这样定义的自定义用户存储:

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

其中一种方法是:

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

该方法由自定义OAuthProvider GrantResourceOwnerCredentials方法中的ASP.NET身份调用,方法是:

        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的对象,因此我需要通过id查找角色,然后将其添加到列表中。

但是,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。

我该怎么办?

0 个答案:

没有答案