有没有办法在我的控制器中获得用户所属的显式角色?这假定使用ASP.NET成员资格和角色提供程序。 “IsInRole”不起作用 - 我需要实际获取它们所在角色的名称。
答案 0 :(得分:27)
用户可以在多个角色中,因此您无法获得该用户所在的一个角色,但您可以轻松获取角色的列表用户在。
您可以使用Roles
类型获取当前登录用户所在的角色列表:
public ActionResult ShowUserRoles() {
string[] roleNames = Roles.GetRolesForUser();
return View(roleNames);
}
或者,如果您想获得任意用户的角色,可以在致电Roles.GetRolesForUser()
时传递用户名。
答案 1 :(得分:26)
您可以从GetRoles方法获取角色列表。 (来自链接)
string[] rolesArray;
public void Page_Load()
{
RolePrincipal r = (RolePrincipal)User;
rolesArray = r.GetRoles();
...//extra code
}
答案 2 :(得分:14)
MVC4中的简单会员:
获得用户的角色 -
var role = System.Web.Security.Roles.GetRolesForUser().Single();
检查用户是否属于某个角色 -
if (User.IsInRole("External"))
答案 3 :(得分:13)
您可以使用Roles.GetRolesForUser()
获取当前用户的角色。
要检查用户是否属于某个角色,请执行以下操作:
Roles.GetRolesForUser().Contains("Administrator")
答案 4 :(得分:3)
我不知道我是否错过了一些奇怪的设置或设置,但我无法得到工作User.IsInRole
或Roles.GetRolesForUser()
。我只是得到一个异常(我认为是null引用),应用程序就停止了。即使我已将RoleManager配置为OwinContext和Create方法等,如Microsoft的Identity Sample项目,以及web.config中启用的Role Manager。
我最初使用另一种方法解决了这个问题,比如这样(db是ApplicationDbContext):
var UserID = User.Identity.GetUserId();
var userRoles = db.Roles.Include(r => r.Users).ToList();
var userRoleNames = (from r in userRoles
from u in r.Users
where u.UserId == UserID
select r.Name).ToList();
这可能不是最优化的方式,并且可以更改为更简单的形式,但它对我有用,并且可能不需要与其他方法一样多的设置/依赖性。 第二种方法是这个(将其添加到您的控制器类):
private ApplicationDbContext db = new ApplicationDbContext();
private ApplicationUserManager _userManager;
public ApplicationUserManager UserManager
{
get
{
return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
}
set
{
_userManager = value;
}
}
private ApplicationRoleManager _roleManager;
public ApplicationRoleManager RoleManager
{
get
{
return _roleManager ?? HttpContext.GetOwinContext().Get<ApplicationRoleManager>();
}
private set
{
_roleManager = value;
}
}
在您的控制器内,您现在可以执行以下操作:
var UserID = User.Identity.GetUserId();
var RolesForUser = await UserManager.GetRolesAsync(UserID);
我使用ASP.NET MVC 5应用程序只是为了清楚。 RoleManager在此示例中未使用,但可用于创建,查找,更新等角色。使用此方法允许使用await进行异步调用,以防对应用程序有益。
答案 5 :(得分:0)
我使用此代码
((ClaimsIdentity)User.Identity).FindAll(ClaimTypes.Role).ToList()
.OrderBy(x => x.Value == "admin" ? 1
: x.Value == "Salesperson" ? 2
: x.Value == "User" ? 3 : 4).First().Value
答案 6 :(得分:0)
如果要获取任何用户的角色名称,则只需在要执行操作的控制器中使用以下两个功能。
public ApplicationSignInManager SignInManager
{
get { return _signInManager ?? HttpContext.GetOwinContext().Get<ApplicationSignInManager>(); }
private set { _signInManager = value; }
}
public ApplicationUserManager UserManager
{
get { return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>(); }
private set { _userManager = value; }
}
,然后在操作中,使用以下行。
var role = UserManager.GetRoles(UserId);
请注意,此处的UserId是ApplicationUser的ID。
此角色将为IList
如果您的应用程序逻辑使得用户只能担任一个角色,则可以通过
进行访问string roleName = role[0];