专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

ASP。NETCoreIdentity系列之五

  这节我们将介绍在Identity中如何使用Role,在我们应用程序中可以通过ASP.NET Core Identity创建Roles并且该角色可以包含一系列权限来执行应用程序的一系列活动
  例如:一个组织可以有4个角色:
  1.Admin – 管理员角色给员工分配工作
  2.Manager –查看客户需求并按时完成项目
  3.Network –用于保持组织的互联网以安全的方式运行。
  4.Security - 系统安全相关权限
  在ASP.NET Core Identity 我们能创建任何数量的Roles并且可以将这些Roles赋值给Identity Users
  1、ASP.NET Core Identity RoleManager类
  我们使用ASP.NET Core Identity RoleManager来管理Role,RoleManager 泛型版本T表示Identity在数据库中的Roles RoleManager定义了一些重要的功能和属性:
  名称
  描述
  CreateAsync(role)
  创建一个新的角色
  DeleteAsync(role)
  删除一个指定的角色
  FindByIdAsync(id)
  根据角色Id查找一个角色
  FindByNameAsync(name)
  根据角色名称查找一个角色
  RoleExistsAsync(name)
  根据角色名称检查角色是否存在
  UpdateAsync(name)
  更新角色
  Roles
  返回Identity中的所有角色
  2、Identity中角色管理  我们使用ASP.NET Core Identity实现一个创建和删除角色的功能,创建一个名字为RoleController.cs并且添加如下代码: public class RoleController : Controller{ private RoleManager _roleManager; public RoleController(RoleManager roleManager) { _roleManager = roleManager; } public IActionResult Index() => View(_roleManager.Roles); private void Errors(IdentityResult result) { foreach (IdentityError error in result.Errors) ModelState.AddModelError("", error.Description); }}
  在RoleController中,通过构造函数注入了RoleManager类,我们可以通过依赖注入获取到该类,并使用它来管理Identity角色 private RoleManager _roleManager;public RoleController(RoleManager roleManager){ _roleManager = roleManager;}获取所有Identity的角色
  RoleManager类Roles属性提供了Identity所有的角色,我们将所有的Roles作为模型类传递给Index视图,代码如下: public IActionResult Index(){ return View(_roleManager.Roles);}接下来我们在View->Role文件夹下创建一个Index.cshtml文件 @using Microsoft.AspNetCore.Identity;@model IEnumerable@{ ViewData["Title"] = "Roles";}   新增                   @foreach (var role in Model) {        }  
编号角色名称用户编辑删除
@role.Id@role.Name 编辑
这个视图中获取了一个IEnumerable类型集合,它将包含Identity所有Role,我们通过foreach循环将所有Role展示在table内,注意i-role我们使用了第三方Attribute,这个Attribute将调用客户自定义的TagHelper,这个特性会修改td并显示当前角色的用户列表   接下来在项目根目录一下创建一个文件夹CustomTagHelpers,在该文件夹下添加一个RoleUsersTH.cs类,并且该类继承TagHelper,这个类提供自定义的CustomerTagHelper /// /// 自定义TagHelper /// [HtmlTargetElement("td", Attributes = "i-role")] public class RoleUsersTH : TagHelper { private UserManager _userManager;    private RoleManager _roleManager; public RoleUsersTH(UserManager userManager, RoleManager roleManager) { _userManager = userManager; _roleManager = roleManager; } [HtmlAttributeName("i-role")] public string Role { get; set; } = !;    public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output) { List names = new List(); var role = await _roleManager.FindByIdAsync(Role); if (role != ) { foreach (var user in _userManager.Users) { if (user != && await _userManager.IsInRoleAsync(user, role.Name ?? "")) names.Add(user.UserName ?? ""); } }    output.Content.SetContent(names.Count == 0 ? "No Users" : string.Join(", ", names)); } }   客户自定义的TagHelper操作td中i-role特性,这个特性获取对应的角色ID,并在后台被处理   我们需要更新_ViewImpo rts.cshtml文件   ASP.NET Core Identity创建角色   我们使用RoleManager的CreateAsync方法创建一个Identity Role,在RoleController类中创建一个CreateAsync方法,代码如下: public IActionResult Create() => View();[HttpPost]public async Task CreateAsync([Required] string name){ if (ModelState.IsValid) { var result = await _roleManager.CreateAsync(new IdentityRole(name)); if (result.Succeeded) return RedirectToAction("Index"); else Errors(result); } return View(name);}   CreateAsync方法入参是name(角色名称)的字符串参数并且使用RoleManager的CreateAsync()方法来创建一个Identity Role var result = await _roleManager.CreateAsync(new IdentityRole(name));我们接下来在Views->Role目录下添加一个Create 视图,代码如下: @model IdentityRole@{ ViewData["Title"] = "新增角色";}   ASP.NET Core Identity删除角色   我们使用RoleManager的DeleteAsync()来删除一个Identity Role, 在RoleController.cs的控制器中创建一个DeleteAsync 方法并接受一个角色id(需要删除的角色),代码如下: public async Task DeleteAsync(string id){ var role = await _roleManager.FindByIdAsync(id); if (role != ) { var identityResult = await _roleManager.DeleteAsync(role); if (identityResult.Succeeded) { return RedirectToAction("Index"); } else { Errors(identityResult); } } else { ModelState.AddModelError("", "No role found"); } return View("Index", _roleManager.Roles);}   测试Identity创建和删除角色功能 运行应用程序并将URL导航 https://localhost:7296/Role/Creat e每次创建完一个角色就会跳转到Index View显示Identity数据库中所有的角色 创建role页面如下:   我们可以通过这个删除按钮删除Identity 数据库中的Role:   3、添加用户到Roles或从Roles中移除用户 现在我们创建一个新的功能,将完成两件事情: 添加用户到指定角色 将用户从角色中移除   为了实现这个功能,我们在Models文件加下添加两个类,分别为RoleEdit和RoleModification public class RoleEdit{ public IdentityRole? Role { get; set; } public IEnumerable? Members { get; set; } public IEnumerable? NoMembers { get; set; }}   RoleEdit表示一个角色和他关联的用户以及和该角色未关联的用户,RoleModification这个类将帮助我们修改一个角色,具体定义如下: public class RoleModification{ [Required] public string RoleName { get; set; } = !;    public string RoleId { get; set; } = !;    public string[]? AddIds { get; set; }    public string[]? DeleteIds { get; set; }}   这两个类帮助我们将一个用户添加到角色中和从角色中移除用户,我们修改一些RoleController类,添加UpdateAsync方法, 下 面Get版本的UpdateAsync方法查询两部分数据,属于该角色的用户和不属于该角色的用户 public async Task UpdateAsync(string id){ var role = await _roleManager.FindByIdAsync(id); List members = new List(); List nonMembers = new List(); foreach (var appUser in _userManager.Users) { var list = await _userManager.IsInRoleAsync(appUser, role?.Name ?? "") ? members : nonMembers; list.Add(appUser); } return View(new RoleEdit() { Role = role, Members = members, NoMembers = nonMembers });}下面Post版本的UpdateAsync方法表示给用户添加和移除角色 [HttpPost] public async Task UpdateAsync(RoleModification roleModification) { if (ModelState.IsValid) { foreach (var userId in roleModification.AddIds ?? new string[] { }) { var appUser = await _userManager.FindByIdAsync(userId); if (appUser != ) { var identityResult = await _userManager.AddToRoleAsync(appUser, roleModification.RoleName); if (!identityResult.Succeeded) Errors(identityResult); } } foreach (var userId in roleModification.DeleteIds ?? new string[] { }) { var appUser = await _userManager.FindByIdAsync(userId); if (appUser != ) { var identityResult = await _userManager.RemoveFromRoleAsync(appUser, roleModification.RoleName); if (!identityResult.Succeeded) Errors(identityResult); } } } if (ModelState.IsValid) return RedirectToAction(nameof(Index)); else return await UpdateAsync(roleModification.RoleId); }注意我们在构造函数中添加了UserManager依赖: private RoleManager _roleManager;private UserManager _userManager;public RoleController(RoleManager roleManager, UserManager userManager){ _roleManager = roleManager; _userManager = userManager;}我们使用UserManager类的下面方法类管理ASP.NET Core Identity Roles   名称   描述   AddToRoleAsync(AppUser user, string name)   将用户添加到指定角色中   RemoveFromRoleAsync(AppUser user, string name)   从指定角色中删除用户   GetRolesAsync(AppUser user)   获取当前用户所有角色   IsInRoleAsync(AppUser user, string name)   判断一个用户是否是指定的角色成员如果是返回ture,否则false 接下来,在Views -> Role 文件夹下添加Update.csthml,代码如下: @model RoleEdit@{ ViewData["Title"] = "编辑角色";}<p asp-validation-summary="All" class="text-danger">p><style> .table-column-width td { width: 200px }style><form class="form" method="post" role="form"> <input type="hidden" name="roleName" value="@Model.Role?.Name" /> <input type="hidden" name="roleId" value="@Model.Role?.Id" /> <h2><small> @Model.Role.Name 角色包含的用户small>h2> <table class="table-column-width table table-bordered"> @if (!Model.Members!.Any()) { <tr> <td>该角色没有关联任何用户td> tr> } else { foreach (var appUser in Model.Members ?? new List<AppUser>()) { <tr> <td>@appUser.UserNametd> <td> <input type="checkbox" name="DeleteIds" value="@appUser.Id" /> td> tr> } } table> <h2><small> @Model.Role.Name 角色未包含的用户small>h2> <table class="table-column-width table table-bordered"> @if (!Model.NoMembers!.Any()) { <tr> <td>该角色保护所有用户td> tr> } else { foreach (var appUser in Model.NoMembers ?? new List<AppUser>()) { <tr> <td>@appUser.UserNametd> <td> <input type="checkbox" name="AddIds" value="@appUser.Id" /> td> tr> } } table> <button class="btn btn-primary">保存button> <button asp-action="index" class="btn btn-secondary">返回button>form>   这个页面包含两个Table: 当前角色包含的用户 当前角色未包含的用户 我们可以选择对应的 checkbox给角色添加和删除用户   测试更新功能   我们先注册三个用户(密码为:Coder77@1):   同时我们也创建了三个角色: 我们查看当前每个角色都没有用户:   一个用户可以指定多个角色,使用这个功能仅仅完成了ASP.NET Core Identity 更新角色的功能,下面我们将实现基于角色的认证 4、基于ASP.NET Core Identity Role 认证 ASP.NET Core Identity 角色可以作为认证,特定角色所包含的用户能访问特定的资源。例如:我们给指定方法设定一个[Authorize(Roles = "SomeRole")]特性,这个角色下的所有用户都能访问这个方法 在HomeController的Index方法添加Authorize特性[Authorize(Roles = "Manager")] , 指明只有Manager角色的用户才能访问HomeController的Index 方法,代码如下: public class HomeController : Controller{ private readonly ILogger _logger; private UserManager _userManager; public HomeController(UserManager userManager, ILogger logger) { _userManager = userManager; _logger = logger; } [Authorize(Roles = "Manager")] public async Task Index() { var appUser = await _userManager.GetUserAsync(HttpContext.User); var message = "Hello " + appUser?.UserName; return View((object)message); }}运行应用程序,使用tom登录,访问HomeController方法我们可以正常访问HomeController的Index方法   因为tom所拥有的角色是Manager。现在我们使用alice 用户进行登录,alice不属于Manager角色,所以当我们尝试访问Home/Index时,应用程序将会跳转到https://localhost:7296   /Account/AccessDenied?ReturnUrl=%2F,因为Account Con tr oller控制器中没有创建AccessDenied方法,因此会获取一个HTTP 404 错误,因此我们在ActionController下创建一个AccessDenied方法: public IActionResult AccessDenied(){ return View();}在Views->Account目录下添加AccessDenied.cshtml视图,代码如下: <h2>Access Deniedh2><a asp-controller="Account" asp-action="Logout" class="btn btn-primary">退出登录a>现在,运行应用程序,并进入登录页面https://localhost:7296 /Account/Login. 使用 alice账户登录:   邮箱–alice@yahoo.com   密码– Coder77@1 登录之后将被调转到Denied URL, 如下图所示:   Identity为我们提供设置了一个默认的/Account/AccessDenied URL地址,我们可以通过配置改变这个地址: builder.Services.ConfigureApplicationCookie( opts => { //默认登录页面 opts.LoginPath = "/Account/Login"; opts.AccessDeniedPath= "/Account/AccessDenied"; //设置Cookie名称 opts.Cookie.Name = ".AspNetCore.Identity.Application"; //设置Cookie超时时间 opts.ExpireTimeSpan = TimeSpan.FromMinutes(20); //设置滑动时间 opts.SlidingExpiration = true; });   总结 这节我们主要讲解了Identity角色管理和身份认证   源代码地址:   https://github.com/bingbing-gui/Asp.Net-Core-Skill/tree/master/AspNetCore.Identity/Identity

科莫多巨蜥的毒液到底有多可怕?2009年,一名31岁的渔民安瓦尔,在印尼科莫多岛上采摘水果,结果不小心从水果树上掉了下来,刚好踩到了一只巨型蜥蜴,蜥蜴瞬间就朝他扑了过去,咬住了他的腿,之后又咬住了他的手臂,身体武汉未来的房价会涨到100000元平米吗?这个问题的答案是肯定的!以目前的趋势,未来武汉房价必然达到10万的水平,只是时间长短的问题。2010年至2017年,短短七年间,武汉的房价已经翻了3番,目前,武汉部分高端楼盘如洞庭兰州青白石片区,中央公园怎么样?兰州北拓的黄金区域,目前基础交通还跟不上建设需要,交通滞后可能会成为十四五期间兰州青白石片区发展的的最大障碍!不过就兰州地理位置和城区格局而言,青白石片区是离主城区最近的待开发区域农民为什么不在国家统计失业范围之内?中国有四个儿子,大儿子叫工人,二儿子叫子弟兵,三儿子叫公务员,四儿子叫农民,所以四儿子就没有纳入统计失业包括养老金范围,因为四儿子有金山银山还有三分地。农民有土地,这是农民可以赖以农村成立社区是什么意思?很多农村驻有村委会办公室,同时也驻有社区管理委员会办公室,特别是在城市郊区的农村和街道的农村都同时设立了村委会和社区管理委员会,很多人弄不明白是怎么回事。那农村成立社区是什么意思呢农村里的剩男,为何一剩再剩呢?到底是什么原因?男女比例失调。计划生育只要一个孩子时,受封建思想影响,都拚命要男孩,等他们长大了,很难找到媳妇。一,农村姑娘远嫁,二,女孩见少,三,彩礼高,四,剩男挣钱少。我就一大龄剩男!个人亲身抖音付费直播试水,看直播要给钱了?我们应该如何思考?使劲收,最好是家人们看的话,一分钟100块钱。毕竟粉丝听话的很。毕竟人设都设计好了打PK,卖货摆错价格,怒亏2个亿回馈粉丝。没事就怼工厂,怼员工反正就是赔钱回馈粉丝。赔完还得补交税马上就要退休了,退休工资才3650元太少了,怎么办?3600不少了。我企业工龄32年,退休时退休金只有2200,涨了这么多年还不到3000。知足常乐吧!如果身体不好,这些钱也够生活了,如果身体还可以,就找一些力所能及的工作,打打工补南宁五象新区未来的发展潜力很大吗?五象新区无法成为国家级新区!!!目前看来,五象新区的潜力也就这样了。我们对比一下贵阳的贵安新区,贵安新区的面积是1700平方公里,由贵阳市的郊区和安顺市合并得来。是全国第8个国家级如果把三峡大坝加高10米,截留更多的洪水,可行吗?我国的三峡大坝,作为当今世界上最大的水利枢纽工程,位于湖北省宜昌市上游,距下游葛洲坝水电站38公里,三峡大坝全长2309米高185米,呈梯形形状,集发电旅游航运调控洪水于一身。三峡大家有经历过亲人去世吗?是怎样走出痛苦和想念的?2018年9月1日下午3点8分,我的妻子在医院里停止了呼吸。她的眼睛没有闭上,我流着泪,帮她合上了双眼。我永远失去了我最亲近的爱人,孩子永远的失去了妈妈。一位好妻子,好女儿,好姑妈
今日竞彩推荐二串一实单阿根廷VS克罗地亚,伯顿VS阿克宁顿阿根廷VS克罗地亚众多诸神最后一舞都已完毕,阿根廷目前也是打进了四强,梅斯球王志在拥有大力神杯,搭配马丁内斯费尔南德兹和阿尔瓦雷斯等新星在进攻端具备一定威慑力,上场点球大战中阿根廷CBA最新消息!2米12中锋加入广东,得分王正式离队,塔比特被裁掉与天津男篮比赛之前,汉密尔顿出现在场边,不过由于没有完成注册,他只能够给队友加油。根据CBA官方公告,广东宏远办理完了相关手续,汉密尔顿正式加入球队,和辽宁男篮的比赛将会上演首秀。小米插线板8位总控版上架,售价34。9元起IT之家12月13日消息,小米新版插线板8位总控版现已上架,1。8m长售价34。9元,3m长售价39。9元。IT之家了解到,小米插线板8位总控版采用了简约白外观,配有8位电源插孔,边策26岁成央视主持,32岁从8楼坠楼身亡,成妈妈余生之痛头条群星10月榜2015年,主持人边策与母亲通话一小时后跳楼自杀。边策坠楼后,网上出现了很多声音。有人说他一直被抑郁症困扰,也有人说工作压力让他放弃了生活,还有人说他是因为感情想不距王国之泪发售还有150天这2022呆不下去了!今天为2022年12月13日,距离塞尔达传说王国之泪正式发售还有150天。本作于今年9月中旬宣布将于2023年5月12日发售,同时也公布了本作的副标题王国之泪和一段新的预告视频。在抚触,传递妈妈的爱所谓的抚触就是给婴儿全身按摩,抚触可以培养婴儿积极,主动,乐观的性格,早期抚触是在婴儿脑发育的关键时期,给脑细胞和神经细胞以适宜的刺激,促进婴儿神经系统发育,促进生长与智能发育。从女子孕早期怕感染,在车上办公,阳过的孕妈喊话能拖一天是一天北京一位男子在网上分享了一段视频,他说自己的妻子怀孕一个月,不能居家办公,不好连续请假,又无法舍弃工作,所以只能把车开到公司户外停车场,在车上办公接见客户。视频最后,男子略显心酸和丈夫吐槽我太太的孕肚,好吓人啊图堆糖(侵删)文小梦夜行梦话,小梦倾听全网同名,欢迎关注,转载请授权,抄袭必究!期待您的故事。贵州一名男子拍摄了一个视频,内容是记录自己妻子怀胎八月的孕肚。肚子上布满了各种各样的妊阿凡达2预售票房1。2亿,成龙新片撤档,吴京刘德华为什么不撤12月6日开启预售至今,阿凡达2的累计预售票房已经突破了1。2亿,这是一个非常恐怖的数据,因为在卡导之前,小编印象中只有沈腾的作品拿到过破亿的预售票房,而沈腾参演的电影都拿到了几十德云社岳云鹏青岛专场取消,难道真的不红了吗?就在12月12日的时候,岳云鹏又上了热搜,这次不是感情的事情,也不是因为购房的事情,而是在上海和孙越的专场演出取消了,这可是让大家没想到的,难道岳云鹏真的没有以前那么出名了吗?我也2022年塌房的10位艺人,个个自毁前程,没有一个值得同情2022年已接近尾声,回顾过往一年,娱乐圈热闹非凡。恋爱的出轨的家暴的爆红的违法犯罪的,一茬接一茬。其中最让人感到震惊的莫过于明星们的花式塌房。明明他们有大好的前程,却偏偏作死,自
友情链接:快好知快生活快百科快传网中准网文好找聚热点快软件