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 身份验证吗?