ASP.NET CORE[练习8]-Identity-用户角色、给用户分配角色、角色校验
練習(xí)+博客,量化自己的進(jìn)步!
用戶管理、用戶登錄已經(jīng)完成,下面開始做用戶角色,以及給用戶分配角色。
1.角色管理
2.給用戶分配角色
3.角色校驗
角色管理
角色管理使用到了RoleManager,同用戶管理一樣,先做一個查、增、改。
1.一個controller,兩個視圖,一個RoleViewModel
2.RoleManager< IdentityRole > roleManager;
roleManager.FindByIdAsync() 根據(jù)Id查詢角色。
roleManager.CreateAsync() 創(chuàng)建角色。
roleManager.UpdateAsync() 更新角色。
先只做角色的增改以及列表查詢
@using Microsoft.AspNetCore.Identity @model List<IdentityRole> @{ViewData["Title"] = "Index"; }<h1>角色列表</h1> <div class="container"><table class="table table-bordered table-striped"><thead><tr><td>編號</td><td>角色</td><td>操作</td></tr></thead><tbody>@foreach (var item in Model){<tr><td>@item.Id</td><td>@item.Name</td><td><a class="btn btn-warning" asp-route-Id="@item.Id" asp-action="Edit">編輯</a></td></tr>}</tbody></table><a class="btn btn-primary" asp-action="Add">添加角色</a> </div>這個是Index的列表視圖
@model RoleViewModel @{ViewData["Title"] = "Add"; }<h1>添加角色</h1> <form role="form" method="post" asp-action="Add"><input type="hidden" name="Type" value="@ViewBag.Type"/>@if (ViewBag.Type == "Edit"){<input type="hidden" asp-for="Id"/>}<div class="form-group row"><label class="col-sm-2 col-form-label" asp-for="Name"></label><div class="col-sm-10"><input type="text" class="form-control" asp-for="Name"/></div><span asp-validation-for="Name"></span></div><div asp-validation-summary="ModelOnly"></div><button type="submit" class="btn-primary">提交</button> </form>這個是添加、修改的視圖
public class RoleViewModel {public string Id { get; set; }[Required,Display(Name ="角色")]public string Name { get; set; } }效果圖如下:
之前的學(xué)生管理、用戶管理,都是這么一套做的,所以做這個角色管理還是挺快的。
給用戶分配角色
1.一個get請求,一個post提交,一個UserRoleViewModel,一個視圖頁面
2.roleManager.FindByIdAsync(Id) 獲取角色。
userManager.Users.ToListAsync() 獲取所有用戶,用于分配角色。
userManager.IsInRoleAsync(user,role.Name) 判斷用戶是否已分配角色。
userManager.FIndByIdAsync(userId) 獲取用戶。
userManager.AddToRoleAsync(user,role.Name) 分配角色給用戶。
3.編輯角色的需要做修改,添加角色用戶的展示。
要在編輯角色的時候展示角色的用戶,效果如下:
后臺的代碼也需要編輯一下:
編輯角色的視圖也編輯一下,添加如下代碼:
@{ViewData["Title"] = "Add";var users = ViewBag.Users as List<ApplicationUser>; }...@if (ViewBag.Type == "Edit") {<hr /><h2>角色用戶</h2><ul>@foreach (var u in users){<li>@u.UserName</li>}</ul><a asp-action="AddRoleToUser" class="btn btn-primary" asp-route-roleId="@Model.Id">為角色添加用戶</a> }添加兩個Action,給用戶分配角色的一個get頁面,一個post提交:
public async Task<IActionResult> AddRoleToUser(string roleId) {var role = await roleManager.FindByIdAsync(roleId);if (role == null){return RedirectToAction(nameof(Index));}var vm = new UserRoleViewModel{RoleId = roleId};var allUser = await userManager.Users.ToListAsync();foreach (var u in allUser){// 判斷用戶是否已經(jīng)分配又該角色if (!await userManager.IsInRoleAsync(u, role.Name)){vm.Users.Add(u);}}return View(vm); }[HttpPost] public async Task<IActionResult> AddRoleToUser(UserRoleViewModel vm) {if (!ModelState.IsValid){ModelState.AddModelError(string.Empty,"數(shù)據(jù)異常!");return View(vm);}var user = await userManager.FindByIdAsync(vm.UserId);var role = await roleManager.FindByIdAsync(vm.RoleId);if (user == null || role == null){ModelState.AddModelError(string.Empty,"用戶不存在或者角色不存在!");return View();}var result = await userManager.AddToRoleAsync(user,role.Name);if (result.Succeeded){// 添加成功跳轉(zhuǎn)到角色編輯頁面return RedirectToAction(nameof(Edit), new { Id = vm.RoleId });}foreach (var error in result.Errors){ModelState.AddModelError(string.Empty,error.Description);}return View(vm); }一個視圖頁面:
@model UserRoleViewModel @{ViewData["Title"] = "AddRoleToUser"; }<h1>給用戶分配角色</h1> <form role="form" method="post" asp-action="AddRoleToUser"><input asp-for="RoleId" type="hidden"/><div class="form-group row"><label class="col-sm-2 col-form-label">用戶</label><div class="col-sm-10"><select class="form-control" asp-for="UserId" asp-items="@(new SelectList(Model.Users,"Id","UserName"))"><option>請選擇</option></select></div></div><div asp-validation-summary="ModelOnly"></div><button type="submit" class="btn btn-primary">提交</button> </form>效果圖如下:
角色校驗
用戶管理、角色管理、給用戶分配角色都做好了,最后就是應(yīng)用了,業(yè)務(wù)場景為,Student學(xué)生管理只允許角色為“Administrator”的用戶訪問。
角色校驗有兩種校驗方式,一種是如下1,直接Roles校驗;一種是如下2、3、4的策略方式。
1.[Authorize(Roles = “Administrator”)] 應(yīng)用到Controller上或Action上
2.services.AddAuthorization 在startup.cs的ConfigureService方法中添加授權(quán)。
3.options.AddPolicy 在services.AddAuthorization中添加授權(quán)策略。
AddPolicy可以添加多種約束方式:
policy.RequireRole 角色約束
policy.RequireClaim Claim約束(這個Claim有點像角色,下節(jié)再做練習(xí))
…
4.[Authorize(Policy = “Admin”)] 應(yīng)用策略到Controller上或Action上
直接校驗Roles:
[Authorize(Roles ="Administrator")] public class StudentController : Controller { ...
前面做練習(xí),已經(jīng)將swk用戶分配了Administrator角色,如此用戶swk登錄口是可以訪問的。
這里校驗角色為visitor,沒有這個角色,更沒有給swk添加了這個角色。所以訪問是受限制的,之所以報上面的錯誤,是應(yīng)為跳轉(zhuǎn)/Account/AccessDenied,這個頁面沒有做。但我們的角色校驗是有效的。
使用Policy校驗:
services.AddAuthorization(options => {// Admin是這條授權(quán)策略的名字,第二個參數(shù)是具體策略,RequireRole的參數(shù)類型是params string[]options.AddPolicy("Admin", policy => policy.RequireRole("Administrator")); });添加授權(quán)
[Authorize(Policy = "Admin")] public class StudentController : Controller { ...應(yīng)用是一樣的,只不過Roles變?yōu)榱薖olicy, Admin這個名字要對應(yīng)添加的策略的名稱。
效果是一樣的。
總結(jié)
用戶有多個角色,授權(quán)有多中策略,根絕情況靈活使用。
總結(jié)
以上是生活随笔為你收集整理的ASP.NET CORE[练习8]-Identity-用户角色、给用户分配角色、角色校验的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux framebuffer双缓冲
- 下一篇: Flash+XML实现电子地图查询及定位