日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

ASP.NET CORE[练习8]-Identity-用户角色、给用户分配角色、角色校验

發(fā)布時間:2024/3/12 asp.net 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ASP.NET CORE[练习8]-Identity-用户角色、给用户分配角色、角色校验 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

練習(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() 更新角色。

public class RoleController : Controller {// 這里沒有像用戶管理那樣擴(kuò)展了IdentityUser,這里使用了基礎(chǔ)的IdentityRoleprivate readonly RoleManager<IdentityRole> roleManager;public RoleController(RoleManager<IdentityRole> roleManager){this.roleManager = roleManager;}public async Task<IActionResult> Index(){return View(await roleManager.Roles.ToListAsync());}public IActionResult Add(){ViewBag.Type = "Add";return View();}public async Task<IActionResult> Edit(string Id){ViewBag.Type = "Edit";var model = await roleManager.FindByIdAsync(Id);return View(nameof(Add), new RoleViewModel{Id = model.Id,Name = model.Name});}[HttpPost]public async Task<IActionResult> Add(RoleViewModel vm){if (!ModelState.IsValid){ModelState.AddModelError(string.Empty, "數(shù)據(jù)異常");return View(vm);}var type = Request.Form["Type"];if (type == "Add"){var result = await roleManager.CreateAsync(new IdentityRole{Name = vm.Name});if (result.Succeeded){return RedirectToAction(nameof(Index));}foreach (var error in result.Errors){ModelState.AddModelError(string.Empty, error.Description);}}else{var model = await roleManager.FindByIdAsync(vm.Id);if (model == null){ModelState.AddModelError(string.Empty, "角色不存在!");}model.Name = vm.Name;var result = await roleManager.UpdateAsync(model);if (result.Succeeded){return RedirectToAction(nameof(Index));}foreach (var error in result.Errors){ModelState.AddModelError(string.Empty, error.Description);}}return View(vm);} }

先只做角色的增改以及列表查詢

@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.編輯角色的需要做修改,添加角色用戶的展示。

要在編輯角色的時候展示角色的用戶,效果如下:

后臺的代碼也需要編輯一下:

public async Task<IActionResult> Edit(string Id) {ViewBag.Type = "Edit";var model = await roleManager.FindByIdAsync(Id);// 獲取角色的所有用戶var users = await userManager.GetUsersInRoleAsync(model.Name);ViewBag.Users = users;return View(nameof(Add), new RoleViewModel{Id = model.Id,Name = model.Name}); }

編輯角色的視圖也編輯一下,添加如下代碼:

@{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登錄口是可以訪問的。

[Authorize(Roles ="Visitor")] public class StudentController : Controller { ...


這里校驗角色為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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。