游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

ASP。NETCoreIdentity系列之五

  这节我们将介绍在Identity中如何使用Role,在我们应用程序中可以通过ASP。NETCoreIdentity创建Roles并且该角色可以包含一系列权限来执行应用程序的一系列活动
  例如:一个组织可以有4个角色:
  1。Admin管理员角色给员工分配工作
  2。Manager查看客户需求并按时完成项目
  3。Network用于保持组织的互联网以安全的方式运行。
  4。Security系统安全相关权限
  在ASP。NETCoreIdentity我们能创建任何数量的Roles并且可以将这些Roles赋值给IdentityUsers
  1、ASP。NETCoreIdentityRoleManager类
  我们使用ASP。NETCoreIdentityRoleManager来管理Role,RoleManager泛型版本T表示Identity在数据库中的RolesRoleManager定义了一些重要的功能和属性:
  名称
  描述
  CreateAsync(role)
  创建一个新的角色
  DeleteAsync(role)
  删除一个指定的角色
  FindByIdAsync(id)
  根据角色Id查找一个角色
  FindByNameAsync(name)
  根据角色名称查找一个角色
  RoleExistsAsync(name)
  根据角色名称检查角色是否存在
  UpdateAsync(name)
  更新角色
  Roles
  返回Identity中的所有角色
  2、Identity中角色管理我们使用ASP。NETCoreIdentity实现一个创建和删除角色的功能,创建一个名字为RoleController。cs并且添加如下代码:spanclasscodesnippetouterspanclasscodesnippetkeywordpublicspanspanclasscodesnippetkeywordclassspanspanclasscodesnippettitleRoleControllerspan:spanclasscodesnippettitleControllerspanspanspanclasscodesnippetouter{spanspanclasscodesnippetouterspanclasscodesnippetkeywordprivatespanRoleManagerIdentityRoleroleManager;spanspanclasscodesnippetouterspanclasscodesnippetfunctionspanclasscodesnippetkeywordpublicspanspanclasscodesnippettitleRoleControllerspan(spanclasscodesnippetparamsRoleManagerIdentityRoleroleManagerspan)spanspanspanclasscodesnippetouter{spanspanclasscodesnippetouterroleManagerroleManager;spanspanclasscodesnippetouter}spanspanclasscodesnippetouterspanclasscodesnippetfunctionspanclasscodesnippetkeywordpublicspanIActionResultspanclasscodesnippettitleIndexspan(spanclasscodesnippetparamsspan)spanView(roleManager。Roles);spanspanclasscodesnippetouterspanclasscodesnippetfunctionspanclasscodesnippetkeywordprivatespanspanclasscodesnippetkeywordvoidspanspanclasscodesnippettitleErrorsspan(spanclasscodesnippetparamsIdentityResultresultspan)spanspanspanclasscodesnippetouter{spanspanclasscodesnippetouterspanclasscodesnippetkeywordforeachspan(IdentityErrorerrorspanclasscodesnippetkeywordinspanresult。Errors)spanspanclasscodesnippetouterModelState。AddModelError(spanclasscodesnippetstringspan,error。Description);spanspanclasscodesnippetouter}spanspanclasscodesnippetouter}span
  在RoleController中,通过构造函数注入了RoleManager类,我们可以通过依赖注入获取到该类,并使用它来管理Identity角色spanclasscodesnippetouterspanclasscodesnippetkeywordprivatespanRoleManagerIdentityRoleroleManager;spanspanclasscodesnippetouterspanclasscodesnippetfunctionspanclasscodesnippetkeywordpublicspanspanclasscodesnippettitleRoleControllerspan(spanclasscodesnippetparamsRoleManagerIdentityRoleroleManagerspan)spanspanspanclasscodesnippetouter{spanspanclasscodesnippetouterroleManagerroleManager;spanspanclasscodesnippetouter}span获取所有Identity的角色
  RoleManager类Roles属性提供了Identity所有的角色,我们将所有的Roles作为模型类传递给Index视图,代码如下:spanclasscodesnippetouterpublicIActionResultIndex()spanspanclasscodesnippetouter{spanspanclasscodesnippetouterreturnView(roleManager。Roles);spanspanclasscodesnippetouter}span接下来我们在ViewRole文件夹下创建一个Index。cshtml文件spanclasscodesnippetouterusingMicrosoft。AspNetCore。Identity;spanspanclasscodesnippetoutermodelIEnumerableIdentityRolespanspanclasscodesnippetouter{spanspanclasscodesnippetouterViewData〔Title〕Roles;spanspanclasscodesnippetouter}spanspanclasscodesnippetouterspanspanclasscodesnippetouterspanspanclasscodesnippetouterspanspanclasscodesnippetouter新增spanspanclasscodesnippetouterspanspanclasscodesnippetouterspanspanclasscodesnippetouterspanspanclasscodesnippetouterspanspanclasscodesnippetouterspanspanclasscodesnippetouterspanspanclasscodesnippetouterspanspanclasscodesnippetoutertableclasstablecontentcentertabletableborderedspanspanclasscodesnippetoutertheadspanspanclasscodesnippetoutertrspanspanclasscodesnippetouterth编号thspanspanclasscodesnippetouterth角色名称thspanspanclasscodesnippetoutertd用户tdspanspanclasscodesnippetouterth编辑thspanspanclasscodesnippetoutertd删除tdspanspanclasscodesnippetoutertrspanspanclasscodesnippetoutertheadspanspanclasscodesnippetoutertbodyspanspanclasscodesnippetouterforeach(varroleinModel)spanspanclasscodesnippetouter{spanspanclasscodesnippetoutertrspanspanclasscodesnippetoutertdrole。Idtdspanspanclasscodesnippetoutertdrole。Nametdspanspanclasscodesnippetoutertdirolerole。Idtdspanspanclasscodesnippetoutertdspanspanclasscodesnippetouter编辑spanspanclasscodesnippetoutertdspanspanclasscodesnippetoutertdspanspanclasscodesnippetouterspanspanclasscodesnippetoutertdspanspanclasscodesnippetoutertrspanspanclasscodesnippetouter}spanspanclasscodesnippetoutertbodyspanspanclasscodesnippetoutertablespanspanclasscodesnippetouterspanspanclasscodesnippetouterspanspanclasscodesnippetouterspan这个视图中获取了一个IEnumerable类型集合,它将包含Identity所有Role,我们通过foreach循环将所有Role展示在table内,注意irole我们使用了第三方Attribute,这个Attribute将调用客户自定义的TagHelper,这个特性会修改td并显示当前角色的用户列表
  接下来在项目根目录一下创建一个文件夹CustomTagHelpers,在该文件夹下添加一个RoleUsersTH。cs类,并且该类继承TagHelper,这个类提供自定义的CustomerTagHelperspanclasscodesnippetoutersummaryspanspanclasscodesnippetouter自定义TagHelperspanspanclasscodesnippetoutersummaryspanspanclasscodesnippetouter〔HtmlTargetElement(td,Attributesirole)〕spanspanclasscodesnippetouterpublicclassRoleUsersTH:TagHelperspanspanclasscodesnippetouter{spanspanclasscodesnippetouterprivateUserManageruserManager;spanspanclasscodesnippetouter
  spanspanclasscodesnippetouterprivateRoleManagerIdentityRoleroleManager;spanspanclasscodesnippetouterpublicRoleUsersTH(UserManageruserManager,RoleManagerIdentityRoleroleManager)spanspanclasscodesnippetouter{spanspanclasscodesnippetouteruserManageruserManager;spanspanclasscodesnippetouterroleManagerroleManager;spanspanclasscodesnippetouter}spanspanclasscodesnippetouter〔HtmlAttributeName(irole)〕spanspanclasscodesnippetouterpublicstringRole{get;set;}!;spanspanclasscodesnippetouter
  spanspanclasscodesnippetouterpublicoverrideasyncTaskProcessAsync(TagHelperContextcontext,TagHelperOutputoutput)spanspanclasscodesnippetouter{spanspanclasscodesnippetouterListstringnamesnewListstring();spanspanclasscodesnippetoutervarroleawaitroleManager。FindByIdAsync(Role);spanspanclasscodesnippetouterif(role!)spanspanclasscodesnippetouter{spanspanclasscodesnippetouterforeach(varuserinuserManager。Users)spanspanclasscodesnippetouter{spanspanclasscodesnippetouterif(user!awaituserManager。IsInRoleAsync(user,role。Name??))spanspanclasscodesnippetouternames。Add(user。UserName??);spanspanclasscodesnippetouter}spanspanclasscodesnippetouter}spanspanclasscodesnippetouter
  spanspanclasscodesnippetouteroutput。Content。SetContent(names。Count0?NoUsers:string。Join(,,names));spanspanclasscodesnippetouter}spanspanclasscodesnippetouter}span
  客户自定义的TagHelper操作td中irole特性,这个特性获取对应的角色ID,并在后台被处理
  我们需要更新ViewImports。cshtml文件
  ASP。NETCoreIdentity创建角色
  我们使用RoleManager的CreateAsync方法创建一个IdentityRole,在RoleController类中创建一个CreateAsync方法,代码如下:spanclasscodesnippetouterspanclasscodesnippetfunctionspanclasscodesnippetkeywordpublicspanIActionResultspanclasscodesnippettitleCreatespan(spanclasscodesnippetparamsspan)spanView();spanspanclasscodesnippetouter〔spanclasscodesnippetmetaHttpPostspan〕spanspanclasscodesnippetouterspanclasscodesnippetfunctionspanclasscodesnippetkeywordpublicspanspanclasscodesnippetkeywordasyncspanTaskIActionResultspanclasscodesnippettitleCreateAsyncspan(spanclasscodesnippetparams〔Required〕spanclasscodesnippetkeywordstringspannamespan)spanspanspanclasscodesnippetouter{spanspanclasscodesnippetouterspanclasscodesnippetkeywordifspan(ModelState。IsValid)spanspanclasscodesnippetouter{spanspanclasscodesnippetouterspanclasscodesnippetkeywordvarspanresultspanclasscodesnippetkeywordawaitspanroleManager。CreateAsync(spanclasscodesnippetkeywordnewspanIdentityRole(name));spanspanclasscodesnippetouterspanclasscodesnippetkeywordifspan(result。Succeeded)spanspanclasscodesnippetouterspanclasscodesnippetkeywordreturnspanRedirectToAction(spanclasscodesnippetstringIndexspan);spanspanclasscodesnippetouterspanclasscodesnippetkeywordelsespanspanspanclasscodesnippetouterErrors(result);spanspanclasscodesnippetouter}spanspanclasscodesnippetouterspanclasscodesnippetkeywordreturnspanView(name);spanspanclasscodesnippetouter}span
  CreateAsync方法入参是name(角色名称)的字符串参数并且使用RoleManager的CreateAsync()方法来创建一个IdentityRolespanclasscodesnippetoutervarresultawaitroleManager。CreateAsync(newIdentityRole(name));span我们接下来在ViewsRole目录下添加一个Create视图,代码如下:spanclasscodesnippetoutermodelIdentityRolespanspanclasscodesnippetouter{spanspanclasscodesnippetouterViewData〔Title〕新增角色;spanspanclasscodesnippetouter}spanspanclasscodesnippetouterspanspanclasscodesnippetouterspan
  ASP。NETCoreIdentity删除角色
  我们使用RoleManager的DeleteAsync()来删除一个IdentityRole,在RoleController。cs的控制器中创建一个DeleteAsync方法并接受一个角色id(需要删除的角色),代码如下:spanclasscodesnippetouterspanclasscodesnippetfunctionspanclasscodesnippetkeywordpublicspanspanclasscodesnippetkeywordasyncspanTaskIActionResultspanclasscodesnippettitleDeleteAsyncspan(spanclasscodesnippetparamsspanclasscodesnippetkeywordstringspanidspan)spanspanspanclasscodesnippetouter{spanspanclasscodesnippetouterspanclasscodesnippetkeywordvarspanrolespanclasscodesnippetkeywordawaitspanroleManager。FindByIdAsync(id);spanspanclasscodesnippetouterspanclasscodesnippetkeywordifspan(role!spanclasscodesnippetliteralspan)spanspanclasscodesnippetouter{spanspanclasscodesnippetouterspanclasscodesnippetkeywordvarspanidentityResultspanclasscodesnippetkeywordawaitspanroleManager。DeleteAsync(role);spanspanclasscodesnippetouterspanclasscodesnippetkeywordifspan(identityResult。Succeeded)spanspanclasscodesnippetouter{spanspanclasscodesnippetouterspanclasscodesnippetkeywordreturnspanRedirectToAction(spanclasscodesnippetstringIndexspan);spanspanclasscodesnippetouter}spanspanclasscodesnippetouterspanclasscodesnippetkeywordelsespanspanspanclasscodesnippetouter{spanspanclasscodesnippetouterErrors(identityResult);spanspanclasscodesnippetouter}spanspanclasscodesnippetouter}spanspanclasscodesnippetouterspanclasscodesnippetkeywordelsespanspanspanclasscodesnippetouter{spanspanclasscodesnippetouterModelState。AddModelError(spanclasscodesnippetstringspan,spanclasscodesnippetstringNorolefoundspan);spanspanclasscodesnippetouter}spanspanclasscodesnippetouterspanclasscodesnippetkeywordreturnspanView(spanclasscodesnippetstringIndexspan,roleManager。Roles);spanspanclasscodesnippetouter}span
  测试Identity创建和删除角色功能运行应用程序并将URL导航https:localhost:7296RoleCreate每次创建完一个角色就会跳转到IndexView显示Identity数据库中所有的角色创建role页面如下:
  我们可以通过这个删除按钮删除Identity数据库中的Role:
  3、添加用户到Roles或从Roles中移除用户现在我们创建一个新的功能,将完成两件事情:添加用户到指定角色将用户从角色中移除
  为了实现这个功能,我们在Models文件加下添加两个类,分别为RoleEdit和RoleModificationspanclasscodesnippetouterspanclasscodesnippetkeywordpublicspanspanclasscodesnippetkeywordclassspanspanclasscodesnippettitleRoleEditspanspanspanclasscodesnippetouter{spanspanclasscodesnippetouterspanclasscodesnippetkeywordpublicspanIdentityRole?Role{spanclasscodesnippetkeywordgetspan;spanclasscodesnippetkeywordsetspan;}spanspanclasscodesnippetouterspanclasscodesnippetkeywordpublicspanIEnumerable?Members{spanclasscodesnippetkeywordgetspan;spanclasscodesnippetkeywordsetspan;}spanspanclasscodesnippetouterspanclasscodesnippetkeywordpublicspanIEnumerable?NoMembers{spanclasscodesnippetkeywordgetspan;spanclasscodesnippetkeywordsetspan;}spanspanclasscodesnippetouter}span
  RoleEdit表示一个角色和他关联的用户以及和该角色未关联的用户,RoleModification这个类将帮助我们修改一个角色,具体定义如下:spanclasscodesnippetouterspanclasscodesnippetkeywordpublicspanspanclasscodesnippetkeywordclassspanspanclasscodesnippettitleRoleModificationspanspanspanclasscodesnippetouter{spanspanclasscodesnippetouter〔spanclasscodesnippetmetaRequiredspan〕spanspanclasscodesnippetouterspanclasscodesnippetkeywordpublicspanspanclasscodesnippetkeywordstringspanRoleName{spanclasscodesnippetkeywordgetspan;spanclasscodesnippetkeywordsetspan;}spanclasscodesnippetliteralspan!;spanspanclasscodesnippetouter
  spanspanclasscodesnippetouterspanclasscodesnippetkeywordpublicspanspanclasscodesnippetkeywordstringspanRoleId{spanclasscodesnippetkeywordgetspan;spanclasscodesnippetkeywordsetspan;}spanclasscodesnippetliteralspan!;spanspanclasscodesnippetouter
  spanspanclasscodesnippetouterspanclasscodesnippetkeywordpublicspanspanclasscodesnippetkeywordstringspan〔〕?AddIds{spanclasscodesnippetkeywordgetspan;spanclasscodesnippetkeywordsetspan;}spanspanclasscodesnippetouter
  spanspanclasscodesnippetouterspanclasscodesnippetkeywordpublicspanspanclasscodesnippetkeywordstringspan〔〕?DeleteIds{spanclasscodesnippetkeywordgetspan;spanclasscodesnippetkeywordsetspan;}spanspanclasscodesnippetouter}span
  这两个类帮助我们将一个用户添加到角色中和从角色中移除用户,我们修改一些RoleController类,添加UpdateAsync方法,下面Get版本的UpdateAsync方法查询两部分数据,属于该角色的用户和不属于该角色的用户spanclasscodesnippetouterspanclasscodesnippetfunctionspanclasscodesnippetkeywordpublicspanspanclasscodesnippetkeywordasyncspanTaskIActionResultspanclasscodesnippettitleUpdateAsyncspan(spanclasscodesnippetparamsspanclasscodesnippetkeywordstringspanidspan)spanspanspanclasscodesnippetouter{spanspanclasscodesnippetouterspanclasscodesnippetkeywordvarspanrolespanclasscodesnippetkeywordawaitspanroleManager。FindByIdAsync(id);spanspanclasscodesnippetouterListmembersspanclasscodesnippetkeywordnewspanList();spanspanclasscodesnippetouterListnonMembersspanclasscodesnippetkeywordnewspanList();spanspanclasscodesnippetouterspanclasscodesnippetkeywordforeachspan(spanclasscodesnippetkeywordvarspanappUserspanclasscodesnippetkeywordinspanuserManager。Users)spanspanclasscodesnippetouter{spanspanclasscodesnippetouterspanclasscodesnippetkeywordvarspanlistspanclasscodesnippetkeywordawaitspanuserManager。IsInRoleAsync(appUser,role?。Name??spanclasscodesnippetstringspan)?members:nonMembers;spanspanclasscodesnippetouterlist。Add(appUser);spanspanclasscodesnippetouter}spanspanclasscodesnippetouterspanclasscodesnippetkeywordreturnspanView(spanclasscodesnippetkeywordnewspanRoleEdit(){Rolerole,Membersmembers,NoMembersnonMembers});spanspanclasscodesnippetouter}span下面Post版本的UpdateAsync方法表示给用户添加和移除角色spanclasscodesnippetouter〔spanclasscodesnippetmetaHttpPostspan〕spanspanclasscodesnippetouterspanclasscodesnippetfunctionspanclasscodesnippetkeywordpublicspanspanclasscodesnippetkeywordasyncspanTaskIActionResultspanclasscodesnippettitleUpdateAsyncspan(spanclasscodesnippetparamsRoleModificationroleModificationspan)spanspanspanclasscodesnippetouter{spanspanclasscodesnippetouterspanclasscodesnippetkeywordifspan(ModelState。IsValid)spanspanclasscodesnippetouter{spanspanclasscodesnippetouterspanclasscodesnippetkeywordforeachspan(spanclasscodesnippetkeywordvarspanuserIdspanclasscodesnippetkeywordinspanroleModification。AddIds??spanclasscodesnippetkeywordnewspanspanclasscodesnippetkeywordstringspan〔〕{})spanspanclasscodesnippetouter{spanspanclasscodesnippetouterspanclasscodesnippetkeywordvarspanappUserspanclasscodesnippetkeywordawaitspanuserManager。FindByIdAsync(userId);spanspanclasscodesnippetouterspanclasscodesnippetkeywordifspan(appUser!spanclasscodesnippetliteralspan)spanspanclasscodesnippetouter{spanspanclasscodesnippetouterspanclasscodesnippetkeywordvarspanidentityResultspanclasscodesnippetkeywordawaitspanuserManager。AddToRoleAsync(appUser,roleModification。RoleName);spanspanclasscodesnippetouterspanclasscodesnippetkeywordifspan(!identityResult。Succeeded)spanspanclasscodesnippetouterErrors(identityResult);spanspanclasscodesnippetouter}spanspanclasscodesnippetouter}spanspanclasscodesnippetouterspanclasscodesnippetkeywordforeachspan(spanclasscodesnippetkeywordvarspanuserIdspanclasscodesnippetkeywordinspanroleModification。DeleteIds??spanclasscodesnippetkeywordnewspanspanclasscodesnippetkeywordstringspan〔〕{})spanspanclasscodesnippetouter{spanspanclasscodesnippetouterspanclasscodesnippetkeywordvarspanappUserspanclasscodesnippetkeywordawaitspanuserManager。FindByIdAsync(userId);spanspanclasscodesnippetouterspanclasscodesnippetkeywordifspan(appUser!spanclasscodesnippetliteralspan)spanspanclasscodesnippetouter{spanspanclasscodesnippetouterspanclasscodesnippetkeywordvarspanidentityResultspanclasscodesnippetkeywordawaitspanuserManager。RemoveFromRoleAsync(appUser,roleModification。RoleName);spanspanclasscodesnippetouterspanclasscodesnippetkeywordifspan(!identityResult。Succeeded)spanspanclasscodesnippetouterErrors(identityResult);spanspanclasscodesnippetouter}spanspanclasscodesnippetouter}spanspanclasscodesnippetouter}spanspanclasscodesnippetouterspanclasscodesnippetkeywordifspan(ModelState。IsValid)spanspanclasscodesnippetouterspanclasscodesnippetkeywordreturnspanRedirectToAction(spanclasscodesnippetkeywordnameofspan(Index));spanspanclasscodesnippetouterspanclasscodesnippetkeywordelsespanspanspanclasscodesnippetouterspanclasscodesnippetkeywordreturnspanspanclasscodesnippetkeywordawaitspanUpdateAsync(roleModification。RoleId);spanspanclasscodesnippetouter}span注意我们在构造函数中添加了UserManager依赖:spanclasscodesnippetouterspanclasscodesnippetattributeprivatespanRoleManagerIdentityRoleroleManager;spanspanclasscodesnippetouterspanclasscodesnippetattributeprivatespanUserManageruserManager;spanspanclasscodesnippetouterspanclasscodesnippetattributepublicspanRoleController(RoleManagerIdentityRoleroleManager,UserManageruserManager)spanspanclasscodesnippetouter{spanspanclasscodesnippetouterspanclasscodesnippetattributeroleManagerspanroleManager;spanspanclasscodesnippetouterspanclasscodesnippetattributeuserManagerspanuserManager;spanspanclasscodesnippetouter}span我们使用UserManager类的下面方法类管理ASP。NETCoreIdentityRoles
  名称
  描述
  AddToRoleAsync(AppUseruser,stringname)
  将用户添加到指定角色中
  RemoveFromRoleAsync(AppUseruser,stringname)
  从指定角色中删除用户
  GetRolesAsync(AppUseruser)
  获取当前用户所有角色
  IsInRoleAsync(AppUseruser,stringname)
  判断一个用户是否是指定的角色成员如果是返回ture,否则false接下来,在ViewsRole文件夹下添加Update。csthml,代码如下:spanclasscodesnippetoutermodelRoleEditspanspanclasscodesnippetouter{spanspanclasscodesnippetouterViewData〔Title〕编辑角色;spanspanclasscodesnippetouter}spanspanclasscodesnippetouterspanclasscodesnippettagspanclasscodesnippetnamepspanspanclasscodesnippetattraspvalidationsummaryspanspanclasscodesnippetstringAllspanspanclasscodesnippetattrclassspanspanclasscodesnippetstringtextdangerspanspanspanclasscodesnippettagspanclasscodesnippetnamepspanspanspanspanclasscodesnippetouterspanclasscodesnippettagspanclasscodesnippetnamestylespanspanspanspanclasscodesnippetouterspanclasscodesnippetselectorclass。tablecolumnwidthspanspanclasscodesnippetselectortagtdspan{spanspanclasscodesnippetouterspanclasscodesnippetattributewidthspan:spanclasscodesnippetnumber200pxspanspanspanclasscodesnippetouter}spanspanclasscodesnippetouterspanclasscodesnippettagspanclasscodesnippetnamestylespanspanspanspanclasscodesnippetouterspanclasscodesnippettagspanclasscodesnippetnameformspanspanclasscodesnippetattrclassspanspanclasscodesnippetstringformspanspanclasscodesnippetattrmethodspanspanclasscodesnippetstringpostspanspanclasscodesnippetattrrolespanspanclasscodesnippetstringformspanspanspanspanclasscodesnippetouterspanclasscodesnippettagspanclasscodesnippetnameinputspanspanclasscodesnippetattrtypespanspanclasscodesnippetstringhiddenspanspanclasscodesnippetattrnamespanspanclasscodesnippetstringroleNamespanspanclasscodesnippetattrvaluespanspanclasscodesnippetstringModel。Role?。NamespanspanspanspanclasscodesnippetouterspanclasscodesnippettagspanclasscodesnippetnameinputspanspanclasscodesnippetattrtypespanspanclasscodesnippetstringhiddenspanspanclasscodesnippetattrnamespanspanclasscodesnippetstringroleIdspanspanclasscodesnippetattrvaluespanspanclasscodesnippetstringModel。Role?。Idspanspanspanspanclasscodesnippetouterspanclasscodesnippettagspanclasscodesnippetnameh2spanspanspanclasscodesnippettagspanclasscodesnippetnamesmallspanspanModel。Role。Name角色包含的用户spanclasscodesnippettagspanclasscodesnippetnamesmallspanspanspanclasscodesnippettagspanclasscodesnippetnameh2spanspanspanspanclasscodesnippetouterspanclasscodesnippettagspanclasscodesnippetnametablespanspanclasscodesnippetattrclassspanspanclasscodesnippetstringtablecolumnwidthtabletableborderedspanspanspanspanclasscodesnippetouterif(!Model。Members!。Any())spanspanclasscodesnippetouter{spanspanclasscodesnippetouterspanclasscodesnippettagspanclasscodesnippetnametrspanspanspanspanclasscodesnippetouterspanclasscodesnippettagspanclasscodesnippetnametdspanspan该角色没有关联任何用户spanclasscodesnippettagspanclasscodesnippetnametdspanspanspanspanclasscodesnippetouterspanclasscodesnippettagspanclasscodesnippetnametrspanspanspanspanclasscodesnippetouter}spanspanclasscodesnippetouterelsespanspanclasscodesnippetouter{spanspanclasscodesnippetouterforeach(varappUserinModel。Members??newListspanclasscodesnippettagspanclasscodesnippetnameAppUserspanspan())spanspanclasscodesnippetouter{spanspanclasscodesnippetouterspanclasscodesnippettagspanclasscodesnippetnametrspanspanspanspanclasscodesnippetouterspanclasscodesnippettagspanclasscodesnippetnametdspanspanappUser。UserNamespanclasscodesnippettagspanclasscodesnippetnametdspanspanspanspanclasscodesnippetouterspanclasscodesnippettagspanclasscodesnippetnametdspanspanspanspanclasscodesnippetouterspanclasscodesnippettagspanclasscodesnippetnameinputspanspanclasscodesnippetattrtypespanspanclasscodesnippetstringcheckboxspanspanclasscodesnippetattrnamespanspanclasscodesnippetstringDeleteIdsspanspanclasscodesnippetattrvaluespanspanclasscodesnippetstringappUser。Idspanspanspanspanclasscodesnippetouterspanclasscodesnippettagspanclasscodesnippetnametdspanspanspanspanclasscodesnippetouterspanclasscodesnippettagspanclasscodesnippetnametrspanspanspanspanclasscodesnippetouter}spanspanclasscodesnippetouter}spanspanclasscodesnippetouterspanclasscodesnippettagspanclasscodesnippetnametablespanspanspanspanclasscodesnippetouterspanclasscodesnippettagspanclasscodesnippetnameh2spanspanspanclasscodesnippettagspanclasscodesnippetnamesmallspanspanModel。Role。Name角色未包含的用户spanclasscodesnippettagspanclasscodesnippetnamesmallspanspanspanclasscodesnippettagspanclasscodesnippetnameh2spanspanspanspanclasscodesnippetouterspanclasscodesnippettagspanclasscodesnippetnametablespanspanclasscodesnippetattrclassspanspanclasscodesnippetstringtablecolumnwidthtabletableborderedspanspanspanspanclasscodesnippetouterif(!Model。NoMembers!。Any())spanspanclasscodesnippetouter{spanspanclasscodesnippetouterspanclasscodesnippettagspanclasscodesnippetnametrspanspanspanspanclasscodesnippetouterspanclasscodesnippettagspanclasscodesnippetnametdspanspan该角色保护所有用户spanclasscodesnippettagspanclasscodesnippetnametdspanspanspanspanclasscodesnippetouterspanclasscodesnippettagspanclasscodesnippetnametrspanspanspanspanclasscodesnippetouter}spanspanclasscodesnippetouterelsespanspanclasscodesnippetouter{spanspanclasscodesnippetouterforeach(varappUserinModel。NoMembers??newListspanclasscodesnippettagspanclasscodesnippetnameAppUserspanspan())spanspanclasscodesnippetouter{spanspanclasscodesnippetouterspanclasscodesnippettagspanclasscodesnippetnametrspanspanspanspanclasscodesnippetouterspanclasscodesnippettagspanclasscodesnippetnametdspanspanappUser。UserNamespanclasscodesnippettagspanclasscodesnippetnametdspanspanspanspanclasscodesnippetouterspanclasscodesnippettagspanclasscodesnippetnametdspanspanspanspanclasscodesnippetouterspanclasscodesnippettagspanclasscodesnippetnameinputspanspanclasscodesnippetattrtypespanspanclasscodesnippetstringcheckboxspanspanclasscodesnippetattrnamespanspanclasscodesnippetstringAddIdsspanspanclasscodesnippetattrvaluespanspanclasscodesnippetstringappUser。Idspanspanspanspanclasscodesnippetouterspanclasscodesnippettagspanclasscodesnippetnametdspanspanspanspanclasscodesnippetouterspanclasscodesnippettagspanclasscodesnippetnametrspanspanspanspanclasscodesnippetouter}spanspanclasscodesnippetouter}spanspanclasscodesnippetouterspanclasscodesnippettagspanclasscodesnippetnametablespanspanspanspanclasscodesnippetouterspanclasscodesnippettagspanclasscodesnippetnamebuttonspanspanclasscodesnippetattrclassspanspanclasscodesnippetstringbtnbtnprimaryspanspan保存spanclasscodesnippettagspanclasscodesnippetnamebuttonspanspanspanspanclasscodesnippetouterspanclasscodesnippettagspanclasscodesnippetnamebuttonspanspanclasscodesnippetattraspactionspanspanclasscodesnippetstringindexspanspanclasscodesnippetattrclassspanspanclasscodesnippetstringbtnbtnsecondaryspanspan返回spanclasscodesnippettagspanclasscodesnippetnamebuttonspanspanspanspanclasscodesnippetouterspanclasscodesnippettagspanclasscodesnippetnameformspanspanspan
  这个页面包含两个Table:当前角色包含的用户当前角色未包含的用户我们可以选择对应的checkbox给角色添加和删除用户
  测试更新功能
  我们先注册三个用户(密码为:Coder771):
  同时我们也创建了三个角色:我们查看当前每个角色都没有用户:
  一个用户可以指定多个角色,使用这个功能仅仅完成了ASP。NETCoreIdentity更新角色的功能,下面我们将实现基于角色的认证4、基于ASP。NETCoreIdentityRole认证ASP。NETCoreIdentity角色可以作为认证,特定角色所包含的用户能访问特定的资源。例如:我们给指定方法设定一个〔Authorize(RolesSomeRole)〕特性,这个角色下的所有用户都能访问这个方法在HomeController的Index方法添加Authorize特性〔Authorize(RolesManager)〕,指明只有Manager角色的用户才能访问HomeController的Index方法,代码如下:spanclasscodesnippetouterspanclasscodesnippetkeywordpublicspanspanclasscodesnippetkeywordclassspanspanclasscodesnippettitleHomeControllerspan:spanclasscodesnippettitleControllerspanspanspanclasscodesnippetouter{spanspanclasscodesnippetouterspanclasscodesnippetkeywordprivatespanspanclasscodesnippetkeywordreadonlyspanILoggerHomeControllerlogger;spanspanclasscodesnippetouterspanclasscodesnippetkeywordprivatespanUserManageruserManager;spanspanclasscodesnippetouterspanclasscodesnippetfunctionspanclasscodesnippetkeywordpublicspanspanclasscodesnippettitleHomeControllerspan(spanclasscodesnippetparamsUserManageruserManager,ILoggerHomeControllerloggerspan)spanspanspanclasscodesnippetouter{spanspanclasscodesnippetouteruserManageruserManager;spanspanclasscodesnippetouterloggerlogger;spanspanclasscodesnippetouter}spanspanclasscodesnippetouter〔spanclasscodesnippetmetaAuthorize(RolesspanclasscodesnippetmetastringManagerspan)span〕spanspanclasscodesnippetouterspanclasscodesnippetfunctionspanclasscodesnippetkeywordpublicspanspanclasscodesnippetkeywordasyncspanTaskIActionResultspanclasscodesnippettitleIndexspan(spanclasscodesnippetparamsspan)spanspanspanclasscodesnippetouter{spanspanclasscodesnippetouterspanclasscodesnippetkeywordvarspanappUserspanclasscodesnippetkeywordawaitspanuserManager。GetUserAsync(HttpContext。User);spanspanclasscodesnippetouterspanclasscodesnippetkeywordvarspanmessagespanclasscodesnippetstringHellospanappUser?。UserName;spanspanclasscodesnippetouterspanclasscodesnippetkeywordreturnspanView((spanclasscodesnippetkeywordobjectspan)message);spanspanclasscodesnippetouter}spanspanclasscodesnippetouter}span运行应用程序,使用tom登录,访问HomeController方法我们可以正常访问HomeController的Index方法
  因为tom所拥有的角色是Manager。现在我们使用alice用户进行登录,alice不属于Manager角色,所以当我们尝试访问HomeIndex时,应用程序将会跳转到https:localhost:7296
  AccountAccessDenied?ReturnUrl2F,因为AccountController控制器中没有创建AccessDenied方法,因此会获取一个HTTP404错误,因此我们在ActionController下创建一个AccessDenied方法:spanclasscodesnippetouterspanclasscodesnippetfunctionspanclasscodesnippetkeywordpublicspanIActionResultspanclasscodesnippettitleAccessDeniedspan(spanclasscodesnippetparamsspan)spanspanspanclasscodesnippetouter{spanspanclasscodesnippetouterspanclasscodesnippetkeywordreturnspanView();spanspanclasscodesnippetouter}span在ViewsAccount目录下添加AccessDenied。cshtml视图,代码如下:spanclasscodesnippetouterspanclasscodesnippettagspanclasscodesnippetnameh2spanspanAccessDeniedspanclasscodesnippettagspanclasscodesnippetnameh2spanspanspanspanclasscodesnippetouterspanclasscodesnippettagspanclasscodesnippetnameaspanspanclasscodesnippetattraspcontrollerspanspanclasscodesnippetstringAccountspanspanclasscodesnippetattraspactionspanspanclasscodesnippetstringLogoutspanspanclasscodesnippetattrclassspanspanclasscodesnippetstringbtnbtnprimaryspanspan退出登录spanclasscodesnippettagspanclasscodesnippetnameaspanspanspan现在,运行应用程序,并进入登录页面https:localhost:7296AccountLogin。使用alice账户登录:
  邮箱aliceyahoo。com
  密码Coder771登录之后将被调转到DeniedURL,如下图所示:
  Identity为我们提供设置了一个默认的AccountAccessDeniedURL地址,我们可以通过配置改变这个地址:spanclasscodesnippetouterbuilder。Services。ConfigureApplicationCookie(spanspanclasscodesnippetouterspanclasscodesnippetfunctionspanclasscodesnippetparamsoptsspanspanspanspanclasscodesnippetouter{spanspanclasscodesnippetouterspanclasscodesnippetcomment默认登录页面spanspanspanclasscodesnippetouteropts。LoginPathspanclasscodesnippetstringAccountLoginspan;spanspanclasscodesnippetouteropts。AccessDeniedPathspanclasscodesnippetstringAccountAccessDeniedspan;spanspanclasscodesnippetouterspanclasscodesnippetcomment设置Cookie名称spanspanspanclasscodesnippetouteropts。Cookie。Namespanclasscodesnippetstring。AspNetCore。Identity。Applicationspan;spanspanclasscodesnippetouterspanclasscodesnippetcomment设置Cookie超时时间spanspanspanclasscodesnippetouteropts。ExpireTimeSpanTimeSpan。FromMinutes(spanclasscodesnippetnumber20span);spanspanclasscodesnippetouterspanclasscodesnippetcomment设置滑动时间spanspanspanclasscodesnippetouteropts。SlidingExpirationspanclasscodesnippetliteraltruespan;spanspanclasscodesnippetouter}spanspanclasscodesnippetouter);span
  总结这节我们主要讲解了Identity角色管理和身份认证
  源代码地址:
  https:github。combingbingguiAsp。NetCoreSkilltreemasterAspNetCore。IdentityIdentity

低调绅士的首选欧米茄星座系列男士腕表〔腕表之家腕表品鉴〕诞生于1952年的欧米茄(OMEGA)星座系列,凭借隽永的设计以及优雅的风格,成为正装表中标志性的存在。在时代的发展之中,如何权衡经典与创新,是各大制表品牌……VDL贝壳提亮液妆前乳真假怎么辨别?VDL贝壳提亮液妆前乳是韩国女星裸妆神器,保湿控油提亮肤色、深层净化收缩毛孔。那么VDL贝壳提亮液妆前乳真假怎么辨别?下面小编为你提供VDL贝壳提亮液妆前乳真假辨别图。VDL贝……携手共进展现金砖担当凝聚共识发挥金砖力量本报记者公欣5年前,中国担任金砖国家主席国。5年来,中国以坚实的行动助力完善金砖国家合作机制,推动金砖合作取得卓越的成效。今年,中国再次担任金砖国家主席国。放眼未来……阿玛尼201和406区别阿玛尼红管唇釉201和406试色对比阿玛尼红管201唇釉是一款姨妈色口红,也是绝版难买的一款网红色号,有人说其实阿玛尼的406和这款颜色十分类似,下面就来做一个试色对比吧!阿玛尼201和406区别颜色棕红色……安娜苏星星口红哪个色最好?安娜苏星星口红试色安娜苏星星口红是安娜苏非常出名的一款口红,这款口红最大的特点就是整个口红都是星星的样子,感觉自己每天都在向星星许愿,直击少女心,下面是安娜苏星星口红试色安娜苏星星口红哪个……黛丝恩洗发水哪款好黛丝恩洗发水什么颜色好新发现黛丝恩这个牌子,它家主要的产品是洗发水,有红、黑、黄三种颜色。那么黛丝恩洗发水哪款好?黛丝恩洗发水什么颜色好?黛丝恩洗发水哪款好黛丝恩红瓶丰盈系列是滋润头皮的适合容……秋冬显白指甲油颜色推荐这4个色妥妥适合黄肌秋冬季节指甲油颜色该换了,春夏我们可以使用明媚的活泼色,但是到了秋冬季节,这种颜色未免有点太拉风,还是低调的气质色更适合秋冬,下面5号网小编带大家来看一下秋冬显白指甲油颜色推荐……原始淳朴的绝美海岛象岛地球分为陆地和海洋,而陆地则由大陆和岛屿两大类组成,岛屿也成了近年来的旅游圣地,世界上有众多岛屿,它们的面积大小各异,形态也差异巨大,风光气候也不尽相同,在泰国的东南海域,就有……这一生,一定要去徒步五台山有人说这一生,一定要去一次五台山听一回晨钟暮鼓翻几页佛家经典烧几柱虔诚清香拜一次佛法无边五台山,在徒步五台的路上,会有一种超凡脱俗的感……女生短发发型推荐这3种发型可以留了在我们平时的日常生活中有很多人都非常喜欢短头发,但是又迟迟不敢剪,怕自己驾驭不了,短发相比长头发更有特点也更清爽可爱,那么下面就由5号网的小编为大家带来女生短发发型推荐,这3种……关晓彤的家里是做什么的郭德纲还要叫关晓彤姑姑吗关晓彤作为京圈的格格,很多人对关晓彤都是非常的熟悉和喜欢的,因为关晓彤是童星出道的,并且现在还是鹿晗的男朋友。一些人好奇为什么关晓彤会有这么好的资源和运气,难道是关晓彤的家世背……2017年眼影流行什么颜色?2017年眼影流行色2017年眼影流行什么颜色呢?其实不少大牌的2017年彩妆资讯已经透露了这一点呢!看起来大胆然而生机勃勃的颜色,一起来看看今年的眼影流行色吧!2017年眼影流行什么颜色……
潘婷三分钟奇迹好用吗?潘婷三分钟奇迹怎么样?潘婷三分钟奇迹就是宋祖儿在花儿与少年3中推荐的产品,这款护发素能够可是我们长发妹子的福音呢,能够很好的滋润你的秀发。今天5号网小编就要为大家介绍一下,潘婷三分钟奇迹好用吗?潘婷……中秋小长假早规划,秦皇岛3天自由行,南戴河这座海上小岛值得去9月最值得期待的大概就是中秋节了,中秋假期的3天小长假说长不长,说短不短,金九银十的好天气,不冷不热,秋风送爽,不安排个短途旅行可惜了。对北京的朋友来说,最容易实现的就是周边三……央视文案1奋斗ampampamp人生1。若你决定灿烂,山无遮,海无拦。撒贝宁2。如果命运是世界上最烂的编剧,你就要争取做你自己人生最好的演员。撒贝宁3。人生不是一个完美的圆环,一旦完美,你就再没有任何……游戏早报索尼PSVR2将于2023年初发售,重力异想世界改编【17173专稿,转载请注明出处】各位玩家朋友们早上好呀!一起来看看昨天夜间到今天凌晨都有哪些游戏圈的大事发生吧。索尼官方宣布PSVR2将于2023年初发售索……18GB1TB120W闪充,发布仅四个月下跌850元,无奈少128GB储存容量够用吗?关于这个问题,不同的人答案可能是不同的,因为有的人不喜欢拍照也不喜欢拍视频,平时看电影也不会缓存到手机中,而且还经常清理垃圾,这个时候128GB机身储……有一种美丽,是遇见了你,有一种深情,是想念着你头条创作挑战赛晚风,吹不走心里的情谊,有一种真爱,叫在心里爱你,自从遇见了你,你就是我心里的唯一,唯一的遗憾,是今生不能永远在一起。有一种美丽,是遇见了你,有一种深……盘点几款适合50岁女人用的抗老护肤品,不比海蓝之谜差,值得入衰老是对女人最大的不公平!好像女人只要衰老,就会受到人们的指指点点。所以大家都用少女感去形容一位女人在抗衰老方面的成功。但是衰老是不可抗的,学会去正视它,应对它,我们才能拥有一……鹿皮关长城被青山绿水环抱着的长城白河水,如碧绿的丝带,静静地流向远方,延绵起伏的山脉穿上了绿色的新装,这座桥就是密云大关桥。桥头的鹿皮关长城,这就是我们铿锵锵三人团今日打卡地,导航雾雨飞虹谷停车场,出发喽……减龄发型2017图片减龄发型2017无论是男性还是女性都希望自己永远年轻,当然这其中除了皮肤的日常保养之外,不如给自己选择一款适合自己的减龄发型也事关重要,而下面小编便要给大家推荐几款时尚而又有气质的减龄发型图片……w。lab隔离霜适合干皮用吗w。lab隔离霜成分安全吗w。lab隔离霜不知道知道这个品牌的人多不多,反正这个品牌的隔离霜有明星推荐过,说这款隔离霜很好用,下面一起来了解下这款隔离霜吧。w。lab隔离霜适合干皮用吗w。lab隔……2023年新农合社保交多少?每人上涨了多少?转眼间、又到了一年一度的新农合社保缴费时间,与往年相比,今年农民交费的意愿似乎比往年少了,不愿意交费了!甚至让村上不少人生出了抵触情绪,究竟为何如此?你今年要不要交新农合社保呢……nars腮红棒色号nars腮红棒试色nars腮红棒是一款多功能化妆棒,可以打高光,可以做眼影还可以做腮红和唇膏,简直是太实用,而且是口红一样的大小,非常方便携带哦!下面为大家介绍nars腮红棒的色号以及试色nar……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网