16 角色管理.mp4 (108.39MB)

Role Manager

  • 创建,删除 Role
  • 把用户添加到 Role
  • 对 Role 进行授权 [Authorize(Roles = "xxxRle")]

要启用默认的 IdentityRole,在 Startup 里面配置时就不能使用 AddDefaultIdentity 了。需要使用 AddIdentity 并指定 User 和 Role:

  1. services.AddIdentity<ApplicationUser, IdentityRole>(options =>
  2. {
  3. options.Password.RequireNonAlphanumeric = false;
  4. ...
  5. })
  6. .AddDefaultUI(UIFramework.Bootstrap4)
  7. .AddEntityFrameworkStores<ApplicationDbContext>();

Role Controller

通过注入的 UserManager 和 RoleManager 操作角色。

单独操作 Role 的代码和 UserController 相似,主要不同在于修改 User 的 Role:

  1. [Authorize]
  2. public class RoleController : Controller
  3. {
  4. private readonly UserManager<ApplicationUser> _userManager;
  5. private readonly RoleManager<IdentityRole> _roleManager;
  6. public RoleController(
  7. UserManager<ApplicationUser> userManager,
  8. RoleManager<IdentityRole> roleManager)
  9. {
  10. _userManager = userManager;
  11. _roleManager = roleManager;
  12. }
  13. public async Task<IActionResult> Index()
  14. {
  15. var roles = await _roleManager.Roles.ToListAsync();
  16. return View(roles);
  17. }
  18. public IActionResult AddRole()
  19. {
  20. return View();
  21. }
  22. [HttpPost]
  23. public async Task<IActionResult> AddRole(RoleAddViewModel roleAddViewModel)
  24. {
  25. if (!ModelState.IsValid)
  26. {
  27. return View(roleAddViewModel);
  28. }
  29. var role = new IdentityRole { Name = roleAddViewModel.RoleName };
  30. var result=await _roleManager.CreateAsync(role);
  31. if (result.Succeeded)
  32. {
  33. return RedirectToAction("Index");
  34. }
  35. foreach (var error in result.Errors)
  36. {
  37. ModelState.AddModelError(string.Empty, error.Description);
  38. }
  39. return View(roleAddViewModel);
  40. }
  41. public async Task<IActionResult> EditRole(string id)
  42. {
  43. var role=await _roleManager.FindByIdAsync(id);
  44. if (role == null)
  45. {
  46. return RedirectToAction("Index");
  47. }
  48. var roleEditViewModel = new RoleEditViewModel
  49. {
  50. Id = id,
  51. RoleName = role.Name,
  52. Users = new List<string>()
  53. };
  54. var users=await _userManager.Users.ToListAsync();
  55. foreach (var user in users)
  56. {
  57. if (await _userManager.IsInRoleAsync(user, role.Name))
  58. {
  59. roleEditViewModel.Users.Add(user.UserName);
  60. }
  61. }
  62. return View(roleEditViewModel);
  63. }
  64. [HttpPost]
  65. public async Task<IActionResult> EditRole(RoleEditViewModel roleEditViewModel)
  66. {
  67. var role = await _roleManager.FindByIdAsync(roleEditViewModel.Id);
  68. if (role != null)
  69. {
  70. role.Name = roleEditViewModel.RoleName;
  71. var result = await _roleManager.UpdateAsync(role);
  72. if (result.Succeeded)
  73. {
  74. return RedirectToAction("Index");
  75. }
  76. ModelState.AddModelError(string.Empty, "更新角色时出错");
  77. return View(roleEditViewModel);
  78. }
  79. return RedirectToAction("Index");
  80. }
  81. [HttpPost]
  82. public async Task<IActionResult> DeleteRole(string id)
  83. {
  84. var role = await _roleManager.FindByIdAsync(id);
  85. if (role != null)
  86. {
  87. var result = await _roleManager.DeleteAsync(role);
  88. if (result.Succeeded)
  89. {
  90. return RedirectToAction("Index");
  91. }
  92. ModelState.AddModelError(string.Empty, "删除角色时出错");
  93. }
  94. ModelState.AddModelError(string.Empty, "没找到该角色");
  95. return View("Index", await _roleManager.Roles.ToListAsync());
  96. }
  97. public async Task<IActionResult> AddUserToRole(string roleId)
  98. {
  99. var role = await _roleManager.FindByIdAsync(roleId);
  100. if (role == null)
  101. {
  102. return RedirectToAction("Index");
  103. }
  104. var vm = new UserRoleViewModel
  105. {
  106. RoleId = role.Id
  107. };
  108. var users = await _userManager.Users.ToListAsync();
  109. foreach (var user in users)
  110. {
  111. if (!await _userManager.IsInRoleAsync(user, role.Name))
  112. {
  113. // 筛选出候选用户
  114. vm.Users.Add(user);
  115. }
  116. }
  117. return View(vm);
  118. }
  119. [HttpPost]
  120. public async Task<IActionResult> AddUserToRole(UserRoleViewModel userRoleViewModel)
  121. {
  122. var user = await _userManager.FindByIdAsync(userRoleViewModel.UserId);
  123. var role = await _roleManager.FindByIdAsync(userRoleViewModel.RoleId);
  124. if (user != null && role != null)
  125. {
  126. var result = await _userManager.AddToRoleAsync(user, role.Name);
  127. if (result.Succeeded)
  128. {
  129. return RedirectToAction("EditRole", new { id = role.Id });
  130. }
  131. foreach (var error in result.Errors)
  132. {
  133. ModelState.AddModelError(string.Empty, error.Description);
  134. }
  135. return View(userRoleViewModel);
  136. }
  137. ModelState.AddModelError(string.Empty, "用户或角色未找到");
  138. return View(userRoleViewModel);
  139. }
  140. public async Task<IActionResult> DeleteUserFromRole(string roleId)
  141. {
  142. var role = await _roleManager.FindByIdAsync(roleId);
  143. if (role == null)
  144. {
  145. return RedirectToAction("Index");
  146. }
  147. var vm = new UserRoleViewModel
  148. {
  149. RoleId = role.Id
  150. };
  151. var users = await _userManager.Users.ToListAsync();
  152. foreach (var user in users)
  153. {
  154. if (await _userManager.IsInRoleAsync(user, role.Name))
  155. {
  156. vm.Users.Add(user);
  157. }
  158. }
  159. return View(vm);
  160. }
  161. [HttpPost]
  162. public async Task<IActionResult> DeleteUserFromRole(UserRoleViewModel userRoleViewModel)
  163. {
  164. var user = await _userManager.FindByIdAsync(userRoleViewModel.UserId);
  165. var role = await _roleManager.FindByIdAsync(userRoleViewModel.RoleId);
  166. if (user != null && role != null)
  167. {
  168. if (await _userManager.IsInRoleAsync(user, role.Name))
  169. {
  170. var result = await _userManager.RemoveFromRoleAsync(user, role.Name);
  171. if (result.Succeeded)
  172. {
  173. return RedirectToAction("EditRole", new { id = role.Id });
  174. }
  175. foreach (var error in result.Errors)
  176. {
  177. ModelState.AddModelError(string.Empty, error.Description);
  178. }
  179. return View(userRoleViewModel);
  180. }
  181. ModelState.AddModelError(string.Empty, "用户不在角色里");
  182. return View(userRoleViewModel);
  183. }
  184. ModelState.AddModelError(string.Empty, "用户或角色未找到");
  185. return View(userRoleViewModel);
  186. }
  187. }