这节我们将介绍在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