如何在 ASP.NET MVC 5 中更改和应用当前用户的角色
How to change and apply role for current user in ASP.NET MVC 5
我先介绍一下导致我出现角色授权问题的步骤。
首先,我在 HomeController.cs
的构造器中添加了 2 个角色
public HomeController()
{
_db = new ApplicationDbContext();
_roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(_db));
_userManager = new ApplicationUserManager(new UserStore<ApplicationUser>(_db));
List<string> roles = new List<string>()
{
"User", "Admin"
};
foreach(string role in roles)
{
if (!_roleManager.RoleExists(role))
{
_roleManager.Create(new IdentityRole(role));
}
}
}
角色已成功添加到数据库中。
然后我在 AccountController.cs
的注册任务中为新注册用户添加角色
...
if (result.Succeeded)
{
await UserManager.AddToRoleAsync(user.Id, "User");
...
角色 User
已成功分配给新用户(table:AspNetUserRoles
)
然后如果我将此用户角色更改为 Admin
,如下所示:
string userId = User.Identity.GetUserId<string>();
_userManager.RemoveFromRole(userId, "User");
_userManager.AddToRole(userId, "Admin");
然后像这样在我的视图 (Razor) 中检查它:
@if(User.IsInRole("Admin"))
{
<p> ok </p>
}
并通过 [Authorize(Roles = "Admin")]
在我的 HomeController 中检查它。
然后失败了两次。 if(User.IsInRole("Admin"))
return false 和 [Authorize(Roles = "Admin")]
也不允许我访问它下面的方法。
此外,这个新注册用户只有 User
角色,因为 [Authorize(Roles = "User")]
有效并且 if(User.IsInRole("User"))
也 return 正确。
奇怪的是 IList<string> roles
:
string userId = User.Identity.GetUserId<string>();
IList<string> roles = _userManager.GetRoles(userId);
实际上是正确的 return 当通过 _userManager.AddToRole(userId, "Admin");
添加新角色时,新角色列表因此具有默认角色 User
的用户现在只有 1 个角色 Admin
(因为我删除了以前的角色)这看起来合乎逻辑并且有效。
如果你知道为什么我的默认角色 User
不能按照上面的方式更改 post 你的答案,谢谢。
要在用户角色替换中应用更改,此用户应重新登录。
基本上假设我们有一些名为 UserService
的服务
public class UserService
{
private ApplicationDbContext _db;
private ApplicationUserManager _userManager;
private ApplicationSignInManager _signInManager;
public UserService()
{
_db = new ApplicationDbContext();
_userManager = new ApplicationUserManager(new UserStore<ApplicationUser>(_db));
IOwinContext owinContext = HttpContext.Current.GetOwinContext();
_signInManager = new ApplicationSignInManager(_userManager, owinContext.Authentication);
}
public async Task SaveRole()
{
ApplicationUser user = _userManager.FindById(HttpContext.Current.User.Identity.GetUserId());
await _signInManager.SignInAsync(user, true, true);
}
}
为用户分配角色后,我们需要调用 SaveRole()
任务来更新身份验证 cookie 以与数据库保持同步。
public class HomeController : Controller
{
private UserService _userService;
public HomeController()
{
_userService = new UserService();
}
public async Task<ActionResult> ApplyRole()
{
await _userService.SaveRole();
return RedirectToAction("JustTestRole", "Home");
}
}
现在在视图 (.cshtml) 中调用 ApplyRole
任务:
<li>@Html.ActionLink("Apply role", "ApplyRole", "Home")</li>
当前用户角色已应用并准备测试。例如:
[Authorize(Roles = "Admin")]
public ActionResult JustTestRole()
{
// to access this action user must have Admin role
}
我先介绍一下导致我出现角色授权问题的步骤。
首先,我在 HomeController.cs
public HomeController()
{
_db = new ApplicationDbContext();
_roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(_db));
_userManager = new ApplicationUserManager(new UserStore<ApplicationUser>(_db));
List<string> roles = new List<string>()
{
"User", "Admin"
};
foreach(string role in roles)
{
if (!_roleManager.RoleExists(role))
{
_roleManager.Create(new IdentityRole(role));
}
}
}
角色已成功添加到数据库中。
然后我在 AccountController.cs
...
if (result.Succeeded)
{
await UserManager.AddToRoleAsync(user.Id, "User");
...
角色 User
已成功分配给新用户(table:AspNetUserRoles
)
然后如果我将此用户角色更改为 Admin
,如下所示:
string userId = User.Identity.GetUserId<string>();
_userManager.RemoveFromRole(userId, "User");
_userManager.AddToRole(userId, "Admin");
然后像这样在我的视图 (Razor) 中检查它:
@if(User.IsInRole("Admin"))
{
<p> ok </p>
}
并通过 [Authorize(Roles = "Admin")]
在我的 HomeController 中检查它。
然后失败了两次。 if(User.IsInRole("Admin"))
return false 和 [Authorize(Roles = "Admin")]
也不允许我访问它下面的方法。
此外,这个新注册用户只有 User
角色,因为 [Authorize(Roles = "User")]
有效并且 if(User.IsInRole("User"))
也 return 正确。
奇怪的是 IList<string> roles
:
string userId = User.Identity.GetUserId<string>();
IList<string> roles = _userManager.GetRoles(userId);
实际上是正确的 return 当通过 _userManager.AddToRole(userId, "Admin");
添加新角色时,新角色列表因此具有默认角色 User
的用户现在只有 1 个角色 Admin
(因为我删除了以前的角色)这看起来合乎逻辑并且有效。
如果你知道为什么我的默认角色 User
不能按照上面的方式更改 post 你的答案,谢谢。
要在用户角色替换中应用更改,此用户应重新登录。
基本上假设我们有一些名为 UserService
public class UserService
{
private ApplicationDbContext _db;
private ApplicationUserManager _userManager;
private ApplicationSignInManager _signInManager;
public UserService()
{
_db = new ApplicationDbContext();
_userManager = new ApplicationUserManager(new UserStore<ApplicationUser>(_db));
IOwinContext owinContext = HttpContext.Current.GetOwinContext();
_signInManager = new ApplicationSignInManager(_userManager, owinContext.Authentication);
}
public async Task SaveRole()
{
ApplicationUser user = _userManager.FindById(HttpContext.Current.User.Identity.GetUserId());
await _signInManager.SignInAsync(user, true, true);
}
}
为用户分配角色后,我们需要调用 SaveRole()
任务来更新身份验证 cookie 以与数据库保持同步。
public class HomeController : Controller
{
private UserService _userService;
public HomeController()
{
_userService = new UserService();
}
public async Task<ActionResult> ApplyRole()
{
await _userService.SaveRole();
return RedirectToAction("JustTestRole", "Home");
}
}
现在在视图 (.cshtml) 中调用 ApplyRole
任务:
<li>@Html.ActionLink("Apply role", "ApplyRole", "Home")</li>
当前用户角色已应用并准备测试。例如:
[Authorize(Roles = "Admin")]
public ActionResult JustTestRole()
{
// to access this action user must have Admin role
}