如何在 asp.net identity 2.0 中查找用户的所有 ApplicationRoles

How to find all ApplicationRoles of a user in asp.net identity 2.0

我尝试使用以下代码获取用户的所有角色对象(即 ApplicationRole 而不是 IdentityUserRole)。

string userId = User.Identity.GetUserId();

var RoleManager = this.HttpContext.GetOwinContext().Get<ApplicationRoleManager>();
var UserManager = this.HttpContext.GetOwinContext().Get<ApplicationUserManager>();

// var u = RoleManager.FindByName("").Users;
// var r = UserManager.FindById(userId).Roles;

var roleNames = ((ClaimsIdentity)User.Identity).Claims
    .Where(c => c.Type == ClaimTypes.Role)
    .Select(c => c.Value);

var userRoles = (from roles in RoleManager.Roles
                    where roleNames.Contains(roles.Name)
                    select roles
                    ).ToList();

但它似乎不一致且微不足道,并且仅适用于当前用户。我希望有更好的方法来做到这一点。

编辑 1:

我的 RoleManager 是从 IdentityRole 派生的 class 具有一些额外的属性,例如说明。

public class ApplicationRole : IdentityRole
{
    public ApplicationRole() : base() { }
    public ApplicationRole(string name, string description)
        : base(name)
    {
        this.Description = description;
    }
    public virtual string Description { get; set; }
}

注意:IdentityUserRole / user.Roles / role.Users 不是角色。这三个都代表了 User & Role

之间的连接 table
var selectedRoleNames = from uf in user.UserRoles
                        join r in RoleManager.Roles on uf.RoleID equals r.ID
                        select r;

这会获取给定用户的角色。如果给定的用户不是当前用户,则不要使用 User.Identity,而是通过 UserManager.

获取用户

或者,如果您已经有任何用户 ID 那么...

var selectedRoleNames = from r in RoleManager.Roles
                        where r.Users.Select(u => u.UserId).Contains(user.Id)
                        select r;