In ASP.NET MVC Core 1.1.1
, Individual User Accounts
mode, VS2017 Ver 15.3.3
, I added some users using Register.cshtml
. Later I created an interface to add two roles to ASPNETRoles
table. Then I decided to add these users to one of the two Roles. But when I tried, for example, to add Administrator user to AdminRole, I'm getting the following validation error even though the users already have email and password into the ASPNETUsers
table. I think the validation error occurs at line var result = await _userManager.AddToRoleAsync(user, "AdminRole");
of the Post action below.
Error
- Email is required 2. Password is required
Note: I think not related to this post - but just in case: I've slightly extended the user model by not using Email as user name; and instead adding an extra attribute UserName to the ApplicationUser.cs class and making some related changes to the Identity model as explained here. But Email is still there as a required attribute and every user does have unique email in ASPNetUsers
table
LoginViewModel:
public class LoginViewModel
{ public SelectList lstUsers { get; set; } [Required] public string SelectedUserName { get; set; } //will be used as selectedUser [Required] [EmailAddress] [Display(Name = "Email")] public string Email { get; set; } [Required] [DataType(DataType.Password)] public string Password { get; set; } [Display(Name = "Remember me?")] public bool RememberMe { get; set; }
}
Controller
....
[HttpGet]
[AllowAnonymous]
public IActionResult AddUserToRole(string returnUrl = null)
{ ViewData["ReturnUrl"] = returnUrl; LoginViewModel loginVM = new LoginViewModel(); loginVM.lstUsers = new SelectList(_userManager.Users.OrderBy(u => u.UserName), "UserName", "UserName"); return View(loginVM);
}
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task AddUserToRole(LoginViewModel model, string returnUrl = null)
{ ViewData["ReturnUrl"] = returnUrl; if (ModelState.IsValid) { //var user = _userManager.FindByNameAsync(model.SelectedUserName); //cannot be used in AddToRoleAsync(user,"AdminRole") since FindByNameAsync returns Task var user = new ApplicationUser { UserName = model.SelectedUserName }; var result = await _userManager.AddToRoleAsync(user, "AdminRole"); if (result.Succeeded) { return RedirectToLocal(returnUrl); } AddErrors(result); } // If we got this far, something failed, redisplay form return View(model);
}
....
AddUserToRole.cshtml
@model LoginViewModel@section Scripts { @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
}