2016-09-05 3 views
0

Я пытаюсь создать нового пользователя и добавить его к выбранной роли. Я хочу выполнить синхронизацию, но всегда получаю сложность в точке создания части ModelState. Если я сделаю это без ModelState, тогда метод будет стекаться в точке adminresult, где пользователь создан с UserManager. Похоже, что есть проблема с добавлением пользователя в выбранную роль, но я не уверен. Я использую Identity 2. Возможно ли создать синхронизацию пользователя или это полностью асинхронный процесс?MVC 5 создает пользователя с использованием 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"); 
     } 
+0

каких сообщения об исключениях, которе вы получаете – Eonasdan

+0

System.NullReferenceException»произошел в App_Web_msvvxqen.dll произошел, когда я пытаюсь создать новый пользователь и добавить его к ролям - может имеет более затем 1 роль, когда я пытаюсь создать пользователя для проекта (используя разные контроллеры и синхронизацию actio n) Я получаю ((System.Data.Entity.Validation.DbEntityValidationException) $ exception). РольEntityValidationErrors для этого пользователя настраивается при создании и имеет onle 1 роль. – Mony

ответ

0

Я бы порекомендовал вам использовать групповые роли вместо предоставления нескольких ролей при входе в систему. Ваша синхронизация будет работать нормально, таким образом, если одиночный роль при входе ..

одна вещь, которую я видел в вашем коде, если вы выбрали несколько роли, почему нет никакого способа, чтобы добавить каждый роль против этого пользователя ...

 // 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); 
    }