首页 > 解决方案 > 如何在.net core 中注册使用角色?

问题描述

我想创建一个具有角色的新用户。我正在使用实体迁移。所以我得到了所有默认表。没有角色,我可以注册一个新用户,但是当我添加角色下拉列表时,我遇到了一个错误无法从字符串转换为 ourproject.entitites.user

请帮助并教我我在哪里做错了。我是 .net 核心技术的新手。

我遇到了 user.Id 的问题

await _userManager.AddToRoleAsync(user.Id, model.UserRoles);

控制器代码:

[HttpPost, ValidateAntiForgeryToken]
        public async Task<IActionResult> Register(RegisterUserModel model)
        {
            if (ModelState.IsValid)
            {
                var user = new User { UserName = model.Username, Email = model.Email,
                    PhoneNumber = model.PhoneNumber };
                //var phoneNo = new User { PhoneNumber = model.PhoneNumber };
                var createResult = await _userManager.CreateAsync(user, model.Password);

                if (createResult.Succeeded)
                {                    
                    await _userManager.AddToRoleAsync(user.Id, model.UserRoles);
                    return RedirectToAction("Details", "Home");                    
                }
                else
                {
                    ViewBag.Name = new SelectList(_Context.Roles.Where(u => !u.Name.Contains("Admin"))
                                          .ToList(), "Name", "Name");
                    foreach (var error in createResult.Errors)
                    {
                        ModelState.AddModelError("", error.Description);
                    }
                }
            }
            return View();
        }

注册型号代码:

 public class RegisterUserModel
    {
        [Required,MaxLength(256)]
        public string Username { get; set; }

        [Required, DataType(DataType.Password)]
        public string Password { get; set; }

        [Required, DataType(DataType.Password), Compare(nameof(Password))]
        public string ConfirmPassword { get; set; }

        [Required, DataType(DataType.EmailAddress),MaxLength(256)]
        public string Email { get; set; }

        [Required,DataType(DataType.PhoneNumber)]
        public string PhoneNumber { get; set; }

        [Display(Name ="UserRoles")]
        public string UserRoles { get; set; }

    }

用户实体代码:

使用 Microsoft.AspNetCore.Identity;

namespace OurProject.Entities
{
    public class User : IdentityUser
    {        
    }
}

标签: asp.net-coreentity-framework-6

解决方案


这是 .net core 2.0 的功能代码。在 AddToRoleAsync 方法中,我发送用户对象本身。

    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Register(RegisterViewModel model, string returnUrl = null)
    {
        ViewData["ReturnUrl"] = returnUrl;
        if (ModelState.IsValid)
        {
            var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
            var result = await _userManager.CreateAsync(user, model.Password);
            if (result.Succeeded)
            {
                string roleName = "Manager";
                var isExistRole = await this._roleManager.RoleExistsAsync(roleName);

                if (!isExistRole)
                {
                    await this._roleManager.CreateAsync(                            
                        new IdentityRole
                    {
                        Id = Guid.NewGuid().ToString(),
                        Name = roleName
                    });
                }

                await _userManager.AddToRoleAsync(user, roleName);

                return RedirectToLocal(returnUrl);
            }
            AddErrors(result);
        }

        // If we got this far, something failed, redisplay form
        return View(model);
    }

推荐阅读