范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

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

包拯60大寿时感叹自己无后,儿媳突然跪下您其实还有个儿子开封古称汴京东京汴梁,开封在古代是北宋的国都,当人们提及开封时脑海里不自觉的会想起清明上河图和一首歌谣开封有个包青天,铁面无私辨忠奸,可想而知包青天的美名和清明上河图的繁华三千就是资治通鉴刘邦修武夺军,从管理学上看,反而韩信的管理不到位资治通鉴载六月,羽已破走彭越,闻汉复军成皋,乃引兵西拔荥阳城,生得周苛。羽谓苛为我将,以公为上将军,封三万户。周苛骂曰若不趋降汉,今为虏矣若非汉王敌也!羽烹周苛,并杀枞公而虏韩王信为了权力,亲兄妹也能反目成仇记永乐时代朱棣一系的公主和驸马前言宣德十年(公元1435年)十月,广平侯袁祯去世。因其无嗣,其庶弟袁瑄于次年正统元年(公元1436年)奏请以兄终弟及的方式袭爵。然而当朝皇帝英宗朱祁镇却不肯同意,给出的理由很奇葩石敬瑭为何会被称为千古第一儿皇帝?史学家认贼作父,割让幽州请大家在阅读前,先点击上面的关注,感谢各位的支持,希望能给大家带来良好的阅读体验,并与您分享阅读的快乐!笔者后续将会为大家带来更多的精彩故事公元942年,后晋高祖石敬瑭麾下的悍将刘巾帼英雄王光被日寇抓获,遭开膛破肚杀害,牺牲时仅有23岁抗日战争自一九三一年九月十八日九一八事变始,至一九四五年九月二日结束历时十四年,给中国人民带来了不可磨灭的伤痛,中华好儿女们浴血奋战,将日本侵略者赶出中国,为此他们付出了巨大的牺牲皮尔斯为24。4万广告费宣传虚拟货币,结果被罚140万据八卦媒体TMZ报道,NBA名人堂成员保罗皮尔斯同意支付140万美元,作为当局指控他在社交媒体页面上不当推广加密货币的处罚。美国证券交易委员会周五宣布了和解协议。此前,该公司指控皮宁德时代大跌超5!新能源本月跑输大盘,赛道股行情落幕了?2月17日,锂电池板块下跌寻支撑,多只锂矿股电池股下跌,其中,万亿市值的宁王宁德时代单日大跌超5。2月份以来,宁德时代累跌近9,明显跑输大盘。消息面上,主要有三点1。市场发酵公司对借呗降额99,缘因银行抽贷有支付宝用户的借呗在调整为信用贷后,却遭到了银行的抽贷,不少用户的额度直接被降为0,甚至无法再继续使用服务了。撰文张浩东出品支付百科自从借呗启动品牌隔离后,蚂蚁与银行就开始分别向支国际货币基金组织驻华首席代表巴奈特IMF为何看好中国今年经济增长来源环球时报环球时报报道记者刘洋丁雅栀2022年,在经济复苏疲软主权债务风险高通胀叠加俄乌冲突的影响下,全球经济下行风险陡增。展望2023年,经济衰退的阴云似乎远未消散。根据国际货对台军售两公司进不可靠实体清单据商务部官网为维护国家主权安全和发展利益,根据中华人民共和国对外贸易法中华人民共和国国家安全法等有关法律,不可靠实体清单工作机制依据不可靠实体清单规定第二条第八条和第十条等有关规定早安中国证监会重磅发布!早安!新的一天开始了,四川观察和你一起开启新的旅程!17日,神舟十四号航天员乘组陈冬刘洋蔡旭哲返回75天后,首次与媒体和公众正式见面。目前3名航天员身心状态良好,后续将转入正常训练
当一个人,慢慢不再联系你,逃不过以下这些原因图源自网络侵权请联系删除随着年龄的增长和阅历的加深,我渐渐意识到一件很残忍的事情,那就是没有谁能陪谁一辈子,人生的路终究还是要自己走。人生的酸甜苦辣咸,也唯有自己能够体会和感受。哪报告显示到2025年循环时尚产业规模将超千亿元工人日报中工网记者杨召奎近日,红布林联合益普索发布的2023循环时尚行业趋势报告(以下简称报告)显示,随着循环经济理念深入人心,以及大众消费心智的逐渐成熟,循环时尚产业开始迎来高速新春走基层一个90后博士村干部的逆向选择在四川省射洪市,兔年春节比往年更加热闹。近年来,射洪市着力打造的十里酒粮牛心村诗歌田园双江村第一水村龙泉村和国防三线中皇村等一系列乡村旅游网红村成为人们新年打卡的热门选择。在牛心村狮岭镇打造时尚智造基地城乡融合美镇的现代化特色产业集群高质量发展看花都2月3日,花都区召开高质量发展大会,贯彻落实省市高质量发展大会精神,以时不我待之姿,吹响全区上下奋进高质量发展的动员号角,坚定不移迈向新一轮大改革大开放大发展的春天。会上,狮岭镇党兔年新春第一团金华企业赴英国出海拓市春节刚过,金华的外贸企业已开始为新一年的市场铆足劲。2月2日下午,由金华36家企业52人组成的拓市经贸团飞往英国参加伯明翰国际春季消费品博览会。新的一年,金华外贸人更拼了。2月3日孩子上托班的好处有哪些?小泥巴亲自然森林托班告诉你小泥巴亲自然森林托班开学啦!开学第一天,托班的老师们就给孩子们准备了开学大吉的仪式,带着孩子们开启了成长之福。孩子们完全没有开学焦虑证,在森林学校里开心的奔跑玩耍,探索大自然里初春人过五十要硬起心肠,心再好也不要对他们客气,这样你会更顺人这一辈子,不是保持好心肠,就一定会有好报的。有时候,你遇到糟糕的人,还对他们报以微笑的话,你是会后悔的。对待好人,就要更好对待烂人,则要冷酷无情。人过五十,对这3种人硬起心肠,反中国历史上最有名49位女人,你知道几个?(一)1吕后吕后,全名吕雉,字娥姁,汉高祖刘邦的皇后,是中国历史上有记载的第一位皇后和皇太后。吕雉,砀郡单父县人,未满20岁时就嫁于刘邦,并生下一儿一女。楚汉争霸中,吕雉等一众家属被楚军陈庭欣,原来你是这么有心机的女人文话多多TVB的御用死角,猪扒港姐陈庭欣,挤破脑袋,也要嫁给带娃的二手男,并且丝毫不介意男友多次劈腿,原因很简单,只因为男友身家10个亿。陈庭欣是谁?喜欢追港剧的网友,想必对她塑造今年流行的衍缝棉服,很适合三四十岁的女人,简约百搭有气质每到秋冬季,棉服就会顺势登场。而在今年的众多棉服款式中,有一种兼具了复古和时尚的系列,被众多网红和穿搭博主所青睐,它就是绗缝棉服。将棉服的表面利用纹路各异的绗缝技术固定起来,整体版一个女人写给老公的7句话1,我可能不是一个合格的老婆,我很世俗也很现实,我希望你能够有出息,将来有一天可以出人头地,让我们不再过这样艰辛的日子。我也希望我们能够锦衣玉食,生活美满,不再为了钱犯愁。但即便是