MVC 5 以同步方式使用 Identity 2 创建用户

Posted

技术标签:

【中文标题】MVC 5 以同步方式使用 Identity 2 创建用户【英文标题】:MVC 5 create user using Identity 2 in synchronous way 【发布时间】:2017-01-12 15:50:03 【问题描述】:

我正在尝试创建新用户并将他添加到所选角色。我想以同步方式进行,但总是在创建部分 ModelState 时堆叠。如果我在没有 ModelState 的情况下创建它,那么方法将堆叠在 adminresult 点,其中用户是使用 UserManager 创建的。将用户添加到所选角色似乎存在问题,但我不确定。我正在使用 Identity 2。是否可以创建用户同步方式或完全异步过程?

[HttpPost]
    public ActionResult Create(User userViewModel, params string[] selectedRoles)
    
        if (ModelState.IsValid)
        
            var user = new User()
            

                UserName = userViewModel.UserName,
                Email = userViewModel.Email,
                FirstName = userViewModel.FirstName,
                LastName = userViewModel.LastName,
                Password = userViewModel.Password
            ;

            var adminresult = UserManager.Create(user, userViewModel.Password); // without using ModelState stack here
            var roleStore = new RoleStore<IdentityRole>(context);
            var roleManager = new RoleManager<IdentityRole>(roleStore);

            var userStore = new UserStore<User>(context);
            var userManager = new UserManager<User>(userStore);
            var result = userManager.AddToRoles(user.Id, selectedRoles);

            if (adminresult.Succeeded)
            
                if (selectedRoles != null)
                

                    if (!result.Succeeded)
                    
                        ModelState.AddModelError("", result.Errors.First());
                        // gets all names of roles to list
                        ViewBag.RoleId = new SelectList(RoleManager.Roles.ToList(), "Name", "Name");
                        return View("_Create");
                    
                
                return RedirectToAction("UserWizardIndex");
            
            return View("_Create");
        

【问题讨论】:

您收到的异常消息是什么 System.NullReferenceException' 发生在 App_Web_msvvxqen.dll 中当我尝试创建新用户并将他添加到角色时发生 - 当我尝试为项目创建用户时,可以有超过 1 个角色(使用不同的控制器和同步操作)我得到 ((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors 该用户的角色在创建时设置并且只有 1 个角色。 【参考方案1】:

我建议您使用基于组的角色,而不是在登录时提供多个角色。 如果单个角色在登录时,您的同步将以这种方式正常工作..

我在您的代码中看到的一件事是,如果您选择了多个 角色为什么没有任何方法可以针对该用户添加每个角色...

       // POST: /Account/Register
    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Register(RegisterViewModel model)
    
        if (ModelState.IsValid)
        

            var roleManager = new RoleManager<IdentityRole>
                (
                new RoleStore<IdentityRole>
                (
                    new ApplicationDbContext()
                )
                 );


            if (!roleManager.RoleExists(model.RoleName))
            
                roleManager.Create(new IdentityRole(model.RoleName));
            

            var user = new ApplicationUser  UserName = model.Email, Email = model.Email ;
            var role = Db.GetUserRoleId(model.RoleName);
            var strRole = role.FirstOrDefault().ToList();
            var result = await UserManager.CreateAsync(user, model.Password);
            if (result.Succeeded)
            
                var userInfo = new UserInformation

                

                    FirstName = model.FirstName,
                    LastName = model.LastName,
                    GUID = user.Id,
                    RoleId = model.RoleId
                ;
                Db.UserInformations.Add(userInfo);
                UserManager.AddToRoles(userInfo.GUID, model.RoleName);
                await UserManager.UpdateSecurityStampAsync(user.Id);
                Db.SaveChanges();

                await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);


                // For more information on how to enable account confirmation and password reset please visit http://go.microsoft.com/fwlink/?LinkID=320771
                // Send an email with this link
                // string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
                // var callbackUrl = Url.Action("ConfirmEmail", "Account", new  userId = user.Id, code = code , protocol: Request.Url.Scheme);
                // await UserManager.SendEmailAsync(user.Id, "Confirm your account", "Please confirm your account by clicking <a href=\"" + callbackUrl + "\">here</a>");

                return RedirectToAction("Index", "Home");
            
            AddErrors(result);
        

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

【讨论】:

以上是关于MVC 5 以同步方式使用 Identity 2 创建用户的主要内容,如果未能解决你的问题,请参考以下文章

如何与 Windows 服务应用程序共享 MVC 5 Identity 2.0 身份验证(尤其是 SignInManager)?

将 asp.net 5 MVC 6 与 Identity 和 EF 6 一起使用的示例

我们可以在不使用 ASP.Net Identity 的情况下使用 MVC 5 提供的 cookie 身份验证吗?

如何扩展User.Identity的可用属性

ASP .NET 5 MVC 6 Identity 3 Roles Claims Groups [关闭]

如何扩展 User.Identity 的可用属性