使用Asp.Net Core Identity给用户添加及删除角色

基于Asp.Net Core编制一个项目,需要给用户添加及删除角色的功能,于是使用到了Identity中的UserManager。

先后解决了几个问题,终于实现了设想。

1. 环境条件

Asp.Net Core 1.0.1

Microsoft.AspNetCore.Identity.EntityFrameworkCore 1.0.0

2. 给用户添加角色(组)使用到UserManager.AddToRolesAsync(),元数据中对AddToRolesAsync的解释为:

        //
        // 摘要:
        //     Add the specified user to the named roles.
        //
        // 参数:
        //   user:
        //     The user to add to the named roles.
        //
        //   roles:
        //     The name of the roles to add the user to.
        //
        // 返回结果:
        //     The System.Threading.Tasks.Task that represents the asynchronous operation, containing
        //     the Microsoft.AspNetCore.Identity.IdentityResult of the operation.
        [AsyncStateMachine(typeof(UserManager<>.<AddToRolesAsync>d__100))]
        public virtual Task<IdentityResult> AddToRolesAsync(TUser user, IEnumerable<string> roles);

在我的代码中对应第一个参数的类型是AppcationUser,第二个参数应该是代表角色(组)的字符串列表;

在controller中该行代码为:

await _userManager.AddToRolesAsync(user, selectedRoles)

在默认角色表中有两个关角色名的字段,一个是“Name”,另外一个是“NormalizedName”,如下图所示:

经过尝试,AddToRolesAsync()中的第二个参数应该是“NormalizedName”。如果使用“Name”会出现错误。

3. 删除用户已有角色会使用到UserManager.RemoveFromRoleAsync(),这个方法同样会使用到AddToRolesAsync()中的两个参数,使用方法与AddToRolesAsync()相同。

但是,Identity提供的获取用户现有角色的方法只有:userManager.GetRolesAsync(user),其中参数“user”为<ApplicationUser>。

这个方法的返回值从元数据中给出的解释是:role names。经过测试实际为“Name”字段。

        //
        // 摘要:
        //     Gets a list of role names the specified user belongs to.
        //
        // 参数:
        //   user:
        //     The user whose role names to retrieve.
        //
        // 返回结果:
        //     The System.Threading.Tasks.Task that represents the asynchronous operation, containing
        //     a list of role names.
        [AsyncStateMachine(typeof(UserManager<>.<GetRolesAsync>d__105))]
        public virtual Task<IList<string>> GetRolesAsync(TUser user);

这样,就出现了不太方便的问题,删除用户角色方法RemoveFromRoleAsync(),需要使用“NormalizedName”,而identity获取的当前用户现有角色只能使用GetRolesAsync(),该方法获得的是角色的“Name”。

所以想当然的代码(如下)不会出现编译错误,同样也不会出现运行错误,但实际运行后,应该被删除的角色实际上删除不了:

var nowRoles = _userManager.GetRolesAsync(user).Result; //得到的nowRoles是角色的Name
await _userManager.RemoveFromRolesAsync(user, nowRoles); //这里需要的是角色的NormalizedName

所以,只能想办法得到当前用户角色的“NormalizedName”,再传递给RemoveFromRoleAsync()。

这面这个办法比较繁琐,但想不到更简单的办法。

var normalizedName = allRoles.Where(r => r.Name == nowRole).First().NormalizedName;

其中:allRoles是这样得到的

var allRoles = _roleManager.Roles;

整个代码是这样的:

                var allRoles = _roleManager.Roles; //系统中所有的角色
                var nowRoles = _userManager.GetRolesAsync(user).Result; //该用户现有的角色“Name”
                foreach (var nowRole in nowRoles)
                {
                    var normalizedName = allRoles.Where(r => r.Name == nowRole).First().NormalizedName;//取得现有角色的NormalizedName
                    await _userManager.RemoveFromRoleAsync(user, normalizedName); //删除不要的角色
                }
                await _userManager.AddToRolesAsync(user, selectedRoles); //添加需要的角色
                await _userManager.UpdateAsync(user); //完成储存

上面代码没有进行针对性的添加,代码有些繁杂,不过这样也不会出现错误,省事儿。

至此,结束。

记录,备查。

时间: 2025-01-02 00:28:26

使用Asp.Net Core Identity给用户添加及删除角色的相关文章

asp.net core 系列之用户认证(1)-给项目添加 Identity

对于没有包含认证(authentication),的项目,你可以使用基架(scaffolder)把 Identity的程序集包加入到项目中,并且选择性的添加Identity的代码进行生成. 虽然基架已经生成了很多必须的代码,但是你仍然需要更新你的项目来完善这个过程. 这篇文章主要就是解释完善Identity基架进行更新的一些步骤 当Identity基架添加以后,一个ScaffoldingReadme.txt 文件就被创建了,这里面会包含一些完善Identity基架的说明.如下 Scaffoldi

ASP.NET Core Identity Hands On(1)——Identity 初次体验

ASP.NET Core Identity是用于构建ASP.NET Core Web应用程序的成员资格系统,包括成员资格.登录和用户数据存储 这是来自于 ASP.NET Core Identity 仓库主页的官方介绍,如果你是个萌新你可能不太理解什么是成员资格,那我来解释一下,成员资格由 membership 直译而来, membership 还有会员资格.会员身份.会员全体等相关含义,我们可以将其简单直接但并非十分恰当的理解为用户管理系统 ASP.NET Core Identity(下文简称I

在 Ubuntu 16.04 上的 ASP.NET Core 应用开发04:使用 ASP.NET Core Identity 的 IdentityServer4 授权服务器

新建 ASP.NET Core Identity 项目 在新建ASP.NET Core Web 应用程序 窗口中分别选择:ASP.NET Core 2.0,Web应用程序(模型视图控制器)和个人用户账号 项目建立后, 运行方式改为使用控制台运行而不是IISExpress, 以便查看各种debug信息. 打开launchSettings.json: { "profiles": { "IdentityManagerServer": { "commandName

Asp.Net Core Identity 完成注册登录

Identity是Asp.Net Core全新的一个用户管理系统,它是一个完善的全面的庞大的框架,提供的功能有: 创建.查询.更改.删除账户信息 验证和授权 密码重置 双重身份认证 支持扩展登录,如微软.Facebook.google.QQ.微信等 提供了一个丰富的API,并且这些API还可以进行大量的扩展 接下来我们先来看下它的简单使用.首先在我们的DbContext中需要继承自IdentityDbContext. public class AppDbContext:IdentityDbCon

使用 ASP.NET Core Identity 的 IdentityServer4 授权服务器(二)

在 使用 ASP.NET Core Identity 的 IdentityServer4 授权服务器(1) 中,IdentityServer4 使用的是内存数据,不方便灵活,这次要把 IdentityServer4 的数据也保存到数据库中. 添加 IdentityServer4.EntityFramework IdentityServer4 有两种类型的数据需要保存数据库中.第一是配置数据(资源和客户端).第二个是 IdentityServer 在使用时产生的操作数据(令牌,代码和同意).这些存

用例子看ASP.NET Core Identity是什么?

原文:用例子看ASP.NET Core Identity是什么? 目录 前言 基于声明的认证(Claims-based Authentication) Claim 在ASP.NET Core Identity中是如何实现的 类ClaimsPrincipal 考察另外一个重要的类ClaimsIdentity 在ASP.NET Core Identity中一同运行 总结 @ 前言 有三个重要的类Claim, ClaimsIdentity, ClaimsPrincipal,我们以一个持有合法证件的学生

第16章 使用ASP.NET Core Identity

注意 对于任何先决条件(例如模板),首先要查看概述. IdentityServer旨在提供灵活性,其中一部分允许您为用户及其数据(包括账户密码)使用所需的任何数据库.如果您从新的用户数据库开始,那么ASP.NET Identity是您可以选择的一个选项.本快速入门显示了如何在IdentityServer中使用ASP.NET Identity. 本快速入门使用ASP.NET Identity的方法是为IdentityServer Host创建一个新项目.这个新项目将取代我们在之前的快速入门中构建的

ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 14. ASP.NET Core Identity 入门

默认的身份认证好授权系统 UserManager用来操作用户的类, Singi用来身份认证的 添加AccountController 先声明SignInManager和UserManager这两个服务 快捷键Ctrl+. 两个都需要分别进行Ctrl+.快速的生成 创建登陆的Action Login 建立View 创建LoginViewModel 主要是用户名和密码两个字段 登陆的逻辑 注册的逻辑 退出的逻辑 创建regiser的视图页面 在_Lauout里面添加了注册和登陆的链接 点击注册发现报

【Asp.Net Core】二、添加控制器和视图

控制器Controller 在添加控制器前,我们先看下它为我们自动生成的一些Controller,我们看下AccountController.cs 来看下登录验证方法Login !!!跟以前的写法好像很多地方不一样?async这个应该是异步 干什么用的呢 ? Task<IActionResult> 是什么? var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.Remem