【问题标题】:MVC 5 create user using Identity 2 in synchronous wayMVC 5 以同步方式使用 Identity 2 创建用户
【发布时间】: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 个角色。

标签: asp.net-identity-2 asp.net-mvc-5


【解决方案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);
    }

【讨论】:

    猜你喜欢
    • 2019-07-07
    • 1970-01-01
    • 2014-08-04
    • 2013-11-10
    • 1970-01-01
    • 2022-12-09
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    相关资源
    最近更新 更多