简单效果展示
1.在controller中建立RoleController.cs
using LibrarySystem.Web.Models;
using LibrarySystem.Web.ViewModels;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace LibrarySystem.Web.Controllers
{
[Authorize]
public class RoleController : Controller
{
private readonly UserManager<Student> _userManager;
private readonly RoleManager<IdentityRole> _roleManager;
public RoleManager<IdentityRole> RoleManager => _roleManager;
public RoleController(
UserManager<Student> userManager,
RoleManager<IdentityRole> roleManager)
{
_userManager = userManager;
_roleManager = roleManager;
}
public async Task<IActionResult> Index()
{
var roles = await RoleManager.Roles.ToListAsync();
return View(roles);
}
//添加角色
public IActionResult AddRole()
{
return View();
}
[HttpPost]
public async Task<IActionResult> AddRole(RoleAddViewModel roleAddViewModel)
{
if (!ModelState.IsValid)
{
return View(roleAddViewModel);
}
var role = new IdentityRole
{
Name = roleAddViewModel.RoleName
};
var result = await RoleManager.CreateAsync(role);
if (result.Succeeded)
{
return RedirectToAction("Index");
}
foreach (var error in result.Errors)
{
ModelState.AddModelError(string.Empty, error.Description);
}
return View(roleAddViewModel);
}
//管理角色
public async Task<IActionResult> EditRole(string id)
{
var role = await RoleManager.FindByIdAsync(id);
if (role == null)
{
return RedirectToAction("Index");
}
var roleEditViewModel = new RoleEditViewModel
{
Id = id,
RoleName = role.Name,
Users = new List<string>()
};
var users = await _userManager.Users.ToListAsync();
foreach (var user in users)
{
if (await _userManager.IsInRoleAsync(user, role.Name))
{
roleEditViewModel.Users.Add(user.UserName);
}
}
return View(roleEditViewModel);
}
[HttpPost]
public async Task<IActionResult> EditRole(RoleEditViewModel roleEditViewModel)
{
var role = await RoleManager.FindByIdAsync(roleEditViewModel.Id);
if (role != null)
{
role.Name = roleEditViewModel.RoleName;
var result = await RoleManager.UpdateAsync(role);
if (result.Succeeded)
{
return RedirectToAction("Index");
}
ModelState.AddModelError(string.Empty, "更新角色时出错");
return View(roleEditViewModel);
}
return RedirectToAction("Index");
}
//删除角色
[HttpPost]
public async Task<IActionResult> DeleteRole(string id)
{
var role = await RoleManager.FindByIdAsync(id);
if (role != null)
{
var result = await RoleManager.DeleteAsync(role);
if (result.Succeeded)
{
return RedirectToAction("Index");
}
ModelState.AddModelError(string.Empty, "删除角色时出错");
}
ModelState.AddModelError(string.Empty, "没找到该角色");
return View("Index", await RoleManager.Roles.ToListAsync());
}
//给用户添加角色
public async Task<IActionResult> AddUserToRole(string roleId)
{
var role = await RoleManager.FindByIdAsync(roleId);
if (role == null)
{
return RedirectToAction("Index");
}
var vm = new UserRoleViewModel
{
RoleId = role.Id
};
var users = await _userManager.Users.ToListAsync();
foreach (var user in users)
{
if (!await _userManager.IsInRoleAsync(user, role.Name))
{
vm.Users.Add(user);
}
}
return View(vm);
}
[HttpPost]
public async Task<IActionResult> AddUserToRole(UserRoleViewModel userRoleViewModel)
{
var user = await _userManager.FindByIdAsync(userRoleViewModel.UserId);
var role = await RoleManager.FindByIdAsync(userRoleViewModel.RoleId);
if (user != null && role != null)
{
var result = await _userManager.AddToRoleAsync(user, role.Name);
if (result.Succeeded)
{
return RedirectToAction("EditRole", new { id = role.Id });
}
foreach (var error in result.Errors)
{
ModelState.AddModelError(string.Empty, error.Description);
}
return View(userRoleViewModel);
}
ModelState.AddModelError(string.Empty, "用户或角色未找到");
return View(userRoleViewModel);
}
//删除用户角色
public async Task<IActionResult> DeleteUserFromRole(string roleId)
{
var role = await RoleManager.FindByIdAsync(roleId);
if (role == null)
{
return RedirectToAction("Index");
}
var vm = new UserRoleViewModel
{
RoleId = role.Id
};
var users = await _userManager.Users.ToListAsync();
foreach (var user in users)
{
if (await _userManager.IsInRoleAsync(user, role.Name))
{
vm.Users.Add(user);
}
}
return View(vm);
}
[HttpPost]
public async Task<IActionResult> DeleteUserFromRole(UserRoleViewModel userRoleViewModel)
{
var user = await _userManager.FindByIdAsync(userRoleViewModel.UserId);
var role = await RoleManager.FindByIdAsync(userRoleViewModel.RoleId);
if (user != null && role != null)
{
if (await _userManager.IsInRoleAsync(user, role.Name))
{
var result = await _userManager.RemoveFromRoleAsync(user, role.Name);
if (result.Succeeded)
{
return RedirectToAction("EditRole", new { id = role.Id });
}
foreach (var error in result.Errors)
{
ModelState.AddModelError(string.Empty, error.Description);
}
return View(userRoleViewModel);
}
ModelState.AddModelError(string.Empty, "用户不在角色里");
return View(userRoleViewModel);
}
ModelState.AddModelError(string.Empty, "用户或角色未找到");
return View(userRoleViewModel);
}
}
}
2.在ViewModel中依次新建RoleAddViewModel.cs、RoleEditViewModel.cs、UserRoleViewModel.cs
using System.ComponentModel.DataAnnotations;
namespace LibrarySystem.Web.ViewModels
{
public class RoleAddViewModel
{
[Required]
[Display(Name = "角色名称")]
public string RoleName { get; set; }
}
}
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
namespace LibrarySystem.Web.ViewModels
{
public class RoleEditViewModel
{
public string Id { get; set; }
[Required]
[Display(Name = "角色名称")]
public string RoleName { get; set; }
public List<string> Users { get; set; }
}
}
using Microsoft.AspNetCore.Identity;
using System.Collections.Generic;
namespace LibrarySystem.Web.ViewModels
{
public class UserRoleViewModel
{
public UserRoleViewModel()
{
Users = new List<IdentityUser>();
}
public string UserId { get; set; }
public string RoleId { get; set; }
public List<IdentityUser> Users { get; set; }
}
}
3.在Views中新建Role文件夹,在文件夹中添加需要的视图
(1)Index.cshtml
@model IEnumerable<Microsoft.AspNetCore.Identity.IdentityRole>
@{
ViewBag.Title = "角色列表";
}
<h2>@ViewBag.Title</h2>
<table class="table">
<thead class="thead-dark">
<tr>
<th scope="col">角色ID</th>
<th scope="col">角色名</th>
<th scope="col">操作</th>
</tr>
</thead>
<tbody>
@foreach (var r in Model)
{
<tr>
<th scope="row">@r.Id</th>
<td>@r.Name</td>
<td>
<form asp-action="DeleteRole" asp-route-id="@r.Id" method="post">
<a asp-action="EditRole" asp-route-id="@r.Id" class="btn btn-primary">编辑</a>
<button type="submit" class="btn btn-danger"
onclick="return confirm('确认删除?')">
删除
</button>
</form>
</td>
</tr>
}
</tbody>
</table>
<a asp-action="AddRole" class="btn btn-primary">添加角色</a>
(2)AddRole.cshtml
@model RoleAddViewModel
@{
ViewBag.Title = "添加角色";
}
<h2>@ViewBag.Title</h2>
<form method="post">
<div class="form-group row">
<label asp-for="RoleName" class="col-sm-2"></label>
<div class="col-sm-10">
<input class="form-control" asp-for="RoleName">
<span class="invalid" asp-validation-for="RoleName"></span>
</div>
</div>
<div class="invalid" asp-validation-summary="ModelOnly">
</div>
<button type="submit" class="btn btn-primary">提交</button>
<a asp-action="Index" class="btn btn-secondary">返回列表</a>
</form>
(3)EditRole.cshtml
@model RoleEditViewModel
@{
ViewBag.Title = "编辑角色";
}
<h2>@ViewBag.Title</h2>
<form method="post">
<div class="form-group row">
<label asp-for="Id" class="col-sm-2"></label>
<div class="col-sm-10">
<input class="form-control" asp-for="Id" readonly>
<span class="invalid" asp-validation-for="Id"></span>
</div>
</div>
<div class="form-group row">
<label asp-for="RoleName" class="col-sm-2"></label>
<div class="col-sm-10">
<input class="form-control" asp-for="RoleName">
<span class="invalid" asp-validation-for="RoleName"></span>
</div>
</div>
<div class="invalid" asp-validation-summary="ModelOnly">
</div>
<button type="submit" class="btn btn-primary">保存</button>
<a asp-action="Index" class="btn btn-secondary">返回列表</a>
</form>
<hr />
<h3>角色的用户</h3>
<ul>
@foreach (var user in Model.Users)
{
<li>@user</li>
}
</ul>
<a asp-action="AddUserToRole" asp-route-roleId="@Model.Id" class="btn btn-primary">
为角色添加用户
</a>
<a asp-action="DeleteUserFromRole" asp-route-roleId="@Model.Id" class="btn btn-primary">
从角色移除用户
</a>
(4)AddUserToRole.cshtml
@model UserRoleViewModel
@{
ViewBag.Title = "添加用户到角色";
}
<h2>@ViewBag.Title</h2>
<form asp-action="AddUserToRole" method="post">
<input type="hidden" name="roleId" value="@Model.RoleId" />
<select class="form-control" asp-for="UserId" asp-items="@(new SelectList(Model.Users, "Id", "UserName"))">
<option> -- 请选择一个用户 -- </option>
</select>
<button class="btn btn-primary" type="submit">添加</button>
<a class="btn btn-secondary" asp-action="EditRole" asp-route-id="@Model.RoleId">返回</a>
</form>
(5)DeleteUserFromRole.cshtml
@model UserRoleViewModel
@{
ViewBag.Title = "从角色移除用户";
}
<h2>@ViewBag.Title</h2>
<form asp-action="DeleteUserFromRole" method="post">
<input type="hidden" name="roleId" value="@Model.RoleId" />
<select class="form-control" asp-for="UserId" asp-items="@(new SelectList(Model.Users, "Id", "UserName"))">
<option> -- 请选择一个用户 -- </option>
</select>
<button class="btn btn-primary" type="submit">移除</button>
<a class="btn btn-secondary" asp-action="EditRole" asp-route-id="@Model.RoleId">返回</a>
</form>
4.在Startup.cs中注册IdentityRole的服务
services.AddIdentity<Student, IdentityRole>(options =>
{
// Password settings.
options.Password.RequireDigit = false;
options.Password.RequireLowercase = false;
options.Password.RequireNonAlphanumeric = false;
options.Password.RequireUppercase = false;
options.Password.RequiredLength = 1;
options.Password.RequiredUniqueChars = 1;
// Lockout settings.
options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
options.Lockout.MaxFailedAccessAttempts = 5;
options.Lockout.AllowedForNewUsers = true;
// User settings.
options.User.AllowedUserNameCharacters =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
options.User.RequireUniqueEmail = false;
}).AddEntityFrameworkStores<StudentIdentityDbContext>()
.AddDefaultTokenProviders();
5.在_Layout.cshtml中添加角色管理按钮
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
管理
</a>
<div class="dropdown-menu" aria-labelledby="navbarDropdown">
<a class="nav-link text-dark" asp-area="" asp-controller="Student" asp-action="Index">学生管理</a>
<a class="nav-link text-dark" asp-area="" asp-controller="Role" asp-action="Index">角色管理</a>
<a class="nav-link text-dark" asp-area="" asp-controller="BookInfo" asp-action="BookDetails">管理图书信息</a>
</div>
</li>
6.运行查看效果