使用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); //完成储存

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

至此,结束。

记录,备查。

 

转载于:https://www.cnblogs.com/jqdy/p/6033683.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ASP.NET Core IdentityASP.NET Core 框架提供的一种身份认证和授权框架,它可以用于管理用户角色和权限。 下面是使用 ASP.NET Core Identity 的步骤: 1. 首先,要在 ASP.NET Core 项目中安装 Microsoft.AspNetCore.Identity 包。 2. 接着,在 Startup.cs 文件中配置 Identity 服务。可以使用 AddIdentity() 方法来配置 Identity,默认情况下会将 Identity 存储在内存中,但这并不适合生产环境。因此,我们需要配置 Identity 存储提供程序。例如,可以使用 Entity Framework Core 来存储 Identity 数据。如果要使用 Entity Framework Core,可以使用 AddEntityFrameworkStores() 方法将 Identity 存储在数据库中。 ```csharp public void ConfigureServices(IServiceCollection services) { // 添加 Identity 服务 services.AddIdentity<IdentityUser, IdentityRole>() .AddEntityFrameworkStores<ApplicationDbContext>() .AddDefaultTokenProviders(); // 添加其他服务 services.AddControllersWithViews(); } ``` 3. 然后,需要创建一个 ApplicationDbContext 类来表示 Identity 数据库上下文。这个类需要继承 IdentityDbContext 类,并指定 IdentityUser 和 IdentityRole 类型。 ```csharp public class ApplicationDbContext : IdentityDbContext<IdentityUser, IdentityRole, string> { public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { } } ``` 4. 在 ConfigureServices() 方法中,还需要配置身份认证和授权选项。例如,可以配置密码复杂性要求、登录尝试锁定、cookie 配置等等。 ```csharp public void ConfigureServices(IServiceCollection services) { // 添加 Identity 服务 services.AddIdentity<IdentityUser, IdentityRole>() .AddEntityFrameworkStores<ApplicationDbContext>() .AddDefaultTokenProviders(); // 配置身份认证和授权选项 services.Configure<IdentityOptions>(options => { // 密码复杂性要求 options.Password.RequireDigit = true; options.Password.RequireLowercase = true; options.Password.RequireNonAlphanumeric = true; options.Password.RequireUppercase = true; options.Password.RequiredLength = 8; // 登录尝试锁定 options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5); options.Lockout.MaxFailedAccessAttempts = 5; // cookie 配置 options.Cookies.ApplicationCookie.ExpireTimeSpan = TimeSpan.FromDays(7); options.Cookies.ApplicationCookie.LoginPath = "/Account/Login"; options.Cookies.ApplicationCookie.LogoutPath = "/Account/Logout"; }); // 添加其他服务 services.AddControllersWithViews(); } ``` 5. 最后,在应用程序中使用 Identity API 来管理用户角色和权限。例如,可以在控制器中使用 UserManager 和 RoleManager 类来创建、删除和修改用户角色。 ```csharp public class AccountController : Controller { private readonly UserManager<IdentityUser> _userManager; private readonly SignInManager<IdentityUser> _signInManager; private readonly RoleManager<IdentityRole> _roleManager; public AccountController(UserManager<IdentityUser> userManager, SignInManager<IdentityUser> signInManager, RoleManager<IdentityRole> roleManager) { _userManager = userManager; _signInManager = signInManager; _roleManager = roleManager; } public IActionResult Register() { return View(); } [HttpPost] public async Task<IActionResult> Register(RegisterViewModel model) { if (ModelState.IsValid) { var user = new IdentityUser { UserName = model.Email, Email = model.Email }; var result = await _userManager.CreateAsync(user, model.Password); if (result.Succeeded) { await _signInManager.SignInAsync(user, isPersistent: false); return RedirectToAction("Index", "Home"); } foreach (var error in result.Errors) { ModelState.AddModelError(string.Empty, error.Description); } } return View(model); } public async Task<IActionResult> CreateRole() { var result = await _roleManager.CreateAsync(new IdentityRole("Admin")); if (result.Succeeded) { return Ok(); } return BadRequest(); } } ``` 以上就是使用 ASP.NET Core Identity 来管理用户角色的步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值