【发布时间】:2011-01-05 07:44:37
【问题描述】:
有没有办法在我的控制器中获取用户所属的显式角色?这假定使用 ASP.NET 成员资格和角色提供程序。 “IsInRole”不起作用 - 我需要实际获取他们所在角色的名称。
【问题讨论】:
标签: asp.net-mvc
有没有办法在我的控制器中获取用户所属的显式角色?这假定使用 ASP.NET 成员资格和角色提供程序。 “IsInRole”不起作用 - 我需要实际获取他们所在角色的名称。
【问题讨论】:
标签: asp.net-mvc
您可以从GetRoles 方法获取角色列表。 (来自链接)
string[] rolesArray;
public void Page_Load()
{
RolePrincipal r = (RolePrincipal)User;
rolesArray = r.GetRoles();
...//extra code
}
【讨论】:
一个用户可以拥有多个角色,因此您无法获得该用户所在的一个角色,但您可以轻松获得角色的列表有一个用户。
可以使用Roles类型获取当前登录用户所在的角色列表:
public ActionResult ShowUserRoles() {
string[] roleNames = Roles.GetRolesForUser();
return View(roleNames);
}
或者,如果您想获取任意用户的角色,您可以在调用 Roles.GetRolesForUser() 时传入用户名。
【讨论】:
您可以通过Roles.GetRolesForUser() 获取当前用户的角色。
为了检查用户是否属于某个角色,这是我所做的:
Roles.GetRolesForUser().Contains("Administrator")
【讨论】:
User.IsInRole("RoleName")来检查用户是否在角色中
MVC4 中的简单成员:
获取用户的角色-
var role = System.Web.Security.Roles.GetRolesForUser().Single();
检查用户是否属于某个角色-
if (User.IsInRole("External"))
【讨论】:
我不知道我是否遗漏了一些奇怪的设置或设置,但我无法获得例如User.IsInRole 或 Roles.GetRolesForUser() 工作。我只是得到一个异常(我认为是空引用),应用程序就停止了。即使我在 Microsoft 的 Identity Sample 项目中为 OwinContext 和 Create 方法等配置了 RoleManager,并且在 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 进行异步调用,以防万一这对您的应用程序有利。
【讨论】:
我使用此代码
((ClaimsIdentity)User.Identity).FindAll(ClaimTypes.Role).ToList()
.OrderBy(x => x.Value == "admin" ? 1
: x.Value == "Salesperson" ? 2
: x.Value == "User" ? 3 : 4).First().Value
【讨论】:
如果您想获取任何用户的角色名称,那么只需在您要执行操作的控制器中使用以下两个函数。
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];
【讨论】: