2015-10-05 57 views
0

我尝试了下面的代码来获取用户的所有角色对象(即ApplicationRole而不是IdentityUserRole)。如何查找用户在asp.net身份2.0中的所有ApplicationRoles

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派生的类有一些额外的属性例如描述。

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不是角色。所有这三个代表用户&角色

+1

你的应用程序的作用是什么意思? – DavidG

+0

你可以使用user.Roles吗? –

+1

默认情况下,没有'ApplicationRole'这样的东西。 'ApplicationUser',与'IdentityUserRole'有关。如果您确实需要实现自己的用户角色类(它继承自IdentityUserRole),那么您可以覆盖它,但在此没有迹象表明您实际上已经这样做了。 –

回答

0
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; 
相关问题