ASP.NET CORE[练习8]-Identity-用户角色、给用户分配角色、角色校验
练习+博客,量化自己的进步!
用户管理、用户登录已经完成,下面开始做用户角色,以及给用户分配角色。
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-用户角色、给用户分配角色、角色校验相关推荐
- Asp.Net Core WebApi 身份验证、注册、用户管理
Asp.Net Core WebApi身份验证.注册.用户管理 用户服务 用户实体.用户模型及数据上下文 应用程序设置文件 在Startup.cs中配置身份验证 参考文献 用了两天的时间研究了在Asp ...
- asp.net core系列 47 Identity 自定义用户数据
一.概述 接着上篇的WebAppIdentityDemo项目,将自定义用户数据添加到Identity DB,自定义扩展的用户数据类应继承IdentityUser类, 文件名为Areas / Ident ...
- asp.net core系列 48 Identity 身份模型自定义
一.概述 ASP.NET Core Identity提供了一个框架,用于管理和存储在 ASP.NET Core 应用中的用户帐户. Identity添加到项目时单个用户帐户选择作为身份验证机制. 默认 ...
- 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 ...
- ASP .NET Core MVC 控制器中获取当前登录用户
微软提供了 身份验证:Microsoft.AspNet.Identity 如果想要在控制器中获取当前登录的用户,如下代码: var userId = this.User.FindFirstValue( ...
- ASP.NET Core的身份认证框架IdentityServer4--(5)自定义用户登录(通过接口登录,无UI版本)...
官网接口详解文档地址:文档地址 (PS:可通过接口名称搜索相应接口信息.) 源码地址:https://github.com/YANGKANG01/IdentityServer4-IdentityAut ...
- 使用依赖注入的ASP.NET Core 2.0用户角色基础动态菜单管理
目录 介绍 背景 先决条件 使用代码 第1步 - 创建数据库 创建数据库 第2步 - 创建ASP.NET Core 更新appsettings.json 步骤3 - 在Startup.cs文件中添加I ...
- ASP.NET Core 基于角色的 JWT 令牌
原文:https://bit.ly/3vYljq3 作者:Rick Strahl 翻译:精致码农-王亮 声明:我翻译技术文章不是逐句翻译的,而是根据我自己的理解来表述的.其中可能会去除一些本人实在不知 ...
- ASP.NET Core 2.0身份和角色管理入门
目录 介绍 身份验证和授权 身份验证 授权 背景 先决条件 使用代码 第1步:创建数据库 第2步:创建ASP.NET Core 更新appsettings.json 步骤3:在Startup.cs文件 ...
- asp.net core利用DI实现自定义用户系统,脱离ControllerBase.User
前言 很多时候其实我们并不需要asp.net core自带的那么复杂的用户系统,基于角色,各种概念,还得用EF Core,而且在web应用中都是把信息存储到cookie中进行通讯(我不喜欢放cooki ...
最新文章
- JVM 常见异常及内存诊断
- 网站设计与开发流程图
- (转)线段树的区间更新
- flutter进行自动编译操作步骤
- Angular NgModule 中的 declarations 和 exports定义
- linux 嵌入式串口通信设计目的,基于linux的嵌入式串口通信.doc
- mysql约束_不是吧,阿Sir,MySQL约束你竟然还不懂!
- ashx文件 验证是否登录_汇总丨增值税综合服务平台登录常见问题解答
- ECMAScript5新特性总结
- 大数据营销有哪些价值
- 使用虚拟环境 virtualenv
- ffmpeg 转码及多线程处理
- ubuntu 安装 mujoco-py
- ADL平台上传数据前的准备工作
- CRM软件成功案例解析
- Oracle 容灾方案选择
- 我和数据类型抗争的血泪史(二十五分钟)
- python点图_Python | 点图
- Codeforces 1106F Lunar New Year and a Recursive Sequence 矩阵快速幂,原根转化模意义下对数,BSGS
- MongoDB 更新数组中的元素