练习+博客,量化自己的进步!

用户管理、用户登录已经完成,下面开始做用户角色,以及给用户分配角色。

1.角色管理
2.给用户分配角色
3.角色校验

角色管理
角色管理使用到了RoleManager,同用户管理一样,先做一个查、增、改。
1.一个controller,两个视图,一个RoleViewModel
2.RoleManager< IdentityRole > roleManager;
roleManager.FindByIdAsync() 根据Id查询角色。
roleManager.CreateAsync() 创建角色。
roleManager.UpdateAsync() 更新角色。

public class RoleController : Controller
{// 这里没有像用户管理那样扩展了IdentityUser,这里使用了基础的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, "数据异常");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; }
}

效果图如下:


之前的学生管理、用户管理,都是这么一套做的,所以做这个角色管理还是挺快的。

给用户分配角色
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){// 判断用户是否已经分配又该角色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,"数据异常!");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){// 添加成功跳转到角色编辑页面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>

效果图如下:

角色校验
用户管理、角色管理、给用户分配角色都做好了,最后就是应用了,业务场景为,Student学生管理只允许角色为“Administrator”的用户访问。

角色校验有两种校验方式,一种是如下1,直接Roles校验;一种是如下2、3、4的策略方式。
1.[Authorize(Roles = “Administrator”)] 应用到Controller上或Action上
2.services.AddAuthorization 在startup.cs的ConfigureService方法中添加授权。
3.options.AddPolicy 在services.AddAuthorization中添加授权策略。
AddPolicy可以添加多种约束方式:
policy.RequireRole 角色约束
policy.RequireClaim Claim约束(这个Claim有点像角色,下节再做练习)

4.[Authorize(Policy = “Admin”)] 应用策略到Controller上或Action上

直接校验Roles:

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


前面做练习,已经将swk用户分配了Administrator角色,如此用户swk登录口是可以访问的。

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


这里校验角色为visitor,没有这个角色,更没有给swk添加了这个角色。所以访问是受限制的,之所以报上面的错误,是应为跳转/Account/AccessDenied,这个页面没有做。但我们的角色校验是有效的。

使用Policy校验:

services.AddAuthorization(options => {// Admin是这条授权策略的名字,第二个参数是具体策略,RequireRole的参数类型是params string[]options.AddPolicy("Admin", policy => policy.RequireRole("Administrator"));
});

添加授权

[Authorize(Policy = "Admin")]
public class StudentController : Controller
{
...

应用是一样的,只不过Roles变为了Policy, Admin这个名字要对应添加的策略的名称。
效果是一样的。

总结
用户有多个角色,授权有多中策略,根绝情况灵活使用。

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

  1. Asp.Net Core WebApi 身份验证、注册、用户管理

    Asp.Net Core WebApi身份验证.注册.用户管理 用户服务 用户实体.用户模型及数据上下文 应用程序设置文件 在Startup.cs中配置身份验证 参考文献 用了两天的时间研究了在Asp ...

  2. asp.net core系列 47 Identity 自定义用户数据

    一.概述 接着上篇的WebAppIdentityDemo项目,将自定义用户数据添加到Identity DB,自定义扩展的用户数据类应继承IdentityUser类, 文件名为Areas / Ident ...

  3. asp.net core系列 48 Identity 身份模型自定义

    一.概述 ASP.NET Core Identity提供了一个框架,用于管理和存储在 ASP.NET Core 应用中的用户帐户. Identity添加到项目时单个用户帐户选择作为身份验证机制. 默认 ...

  4. ASP.NET Core Web API + Identity Server 4 + Angular 6 实战小项目视频

    今天开始尝试录制ASP.NET Core Web API的教学视频. 这是一个小项目的实战视频, 该项目采用了: ASP.NET Core 2.1 做API Identity Server 4 Ang ...

  5. ASP .NET Core MVC 控制器中获取当前登录用户

    微软提供了 身份验证:Microsoft.AspNet.Identity 如果想要在控制器中获取当前登录的用户,如下代码: var userId = this.User.FindFirstValue( ...

  6. ASP.NET Core的身份认证框架IdentityServer4--(5)自定义用户登录(通过接口登录,无UI版本)...

    官网接口详解文档地址:文档地址 (PS:可通过接口名称搜索相应接口信息.) 源码地址:https://github.com/YANGKANG01/IdentityServer4-IdentityAut ...

  7. 使用依赖注入的ASP.NET Core 2.0用户角色基础动态菜单管理

    目录 介绍 背景 先决条件 使用代码 第1步 - 创建数据库 创建数据库 第2步 - 创建ASP.NET Core 更新appsettings.json 步骤3 - 在Startup.cs文件中添加I ...

  8. ASP.NET Core 基于角色的 JWT 令牌

    原文:https://bit.ly/3vYljq3 作者:Rick Strahl 翻译:精致码农-王亮 声明:我翻译技术文章不是逐句翻译的,而是根据我自己的理解来表述的.其中可能会去除一些本人实在不知 ...

  9. ASP.NET Core 2.0身份和角色管理入门

    目录 介绍 身份验证和授权 身份验证 授权 背景 先决条件 使用代码 第1步:创建数据库 第2步:创建ASP.NET Core 更新appsettings.json 步骤3:在Startup.cs文件 ...

  10. asp.net core利用DI实现自定义用户系统,脱离ControllerBase.User

    前言 很多时候其实我们并不需要asp.net core自带的那么复杂的用户系统,基于角色,各种概念,还得用EF Core,而且在web应用中都是把信息存储到cookie中进行通讯(我不喜欢放cooki ...

最新文章

  1. JVM 常见异常及内存诊断
  2. 网站设计与开发流程图
  3. (转)线段树的区间更新
  4. flutter进行自动编译操作步骤
  5. Angular NgModule 中的 declarations 和 exports定义
  6. linux 嵌入式串口通信设计目的,基于linux的嵌入式串口通信.doc
  7. mysql约束_不是吧,阿Sir,MySQL约束你竟然还不懂!
  8. ashx文件 验证是否登录_汇总丨增值税综合服务平台登录常见问题解答
  9. ECMAScript5新特性总结
  10. 大数据营销有哪些价值
  11. 使用虚拟环境 virtualenv
  12. ffmpeg 转码及多线程处理
  13. ubuntu 安装 mujoco-py
  14. ADL平台上传数据前的准备工作
  15. CRM软件成功案例解析
  16. Oracle 容灾方案选择
  17. 我和数据类型抗争的血泪史(二十五分钟)
  18. python点图_Python | 点图
  19. Codeforces 1106F Lunar New Year and a Recursive Sequence 矩阵快速幂,原根转化模意义下对数,BSGS
  20. MongoDB 更新数组中的元素

热门文章

  1. 【黑金原创教程】【Modelsim】【第六章】结束就是开始
  2. 男性健身全攻略 男人4大方法快速塑形
  3. IT十年人生过客1-开篇
  4. 微信支付rootca.pem通用根证书文件,亲测可用
  5. Django3+Vue美多商城项目的总结
  6. css3动画与过渡效果结合出现的树叶飘落效果
  7. 没时间解释了快上车!0.04折老司机建站节福利来了
  8. jk触发器改为四进制_这节课讲触发器
  9. 白魔法师-牛客小白月赛25
  10. 移动端SEO技术难但机会大 优化要点总结