2016-09-15 3 views
3

Я создаю систему регистрации пользователей с использованием .NET Core, Identity Core и MVC Core. Я могу создавать пользователей и создавать роли в базе данных.userManager.AddToRoleAsync() - Ошибка: роль не существует

Вот форма на том, что позволяет мне выбрать пользователя и выберите роль, чтобы добавить:

@using (Html.BeginForm("AddRoleToUser", "Roles")) 
{ 
    @Html.AntiForgeryToken() 
    @Html.ValidationSummary(true) 

    <p> 
     Username : @Html.DropDownList("UserName", (IEnumerable<SelectListItem>)ViewBag.Users, "Select ...") 
     Role Name: @Html.DropDownList("RoleName", (IEnumerable<SelectListItem>)ViewBag.Roles, "Select ...") 

    </p> 

    <input type="submit" value="Save" /> 
} 

Эти раскрывающиеся списки заполняются пользователями и ролями, которые уже существуют в базе данных. Они позволяют мне выбрать User s и имя той роли, которую я уже создал. Например, у меня есть роль с именем «admin», эта форма позволяет мне выбрать строку «admin».

Вот действие, которое обрабатывает добавление роли пользователя:

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public async Task<IActionResult> AddRoleToUser(string UserName, string RoleName) 
    { 
     try 
     { 
      ApplicationUser user = _db.Users.Where(u => u.UserName.Equals(UserName, StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault(); 
      await _userManager.AddToRoleAsync(user, RoleName); 
      PrepopulateDropDownMenus(); 
      ViewBag.ResultMessage = "Role created successfully!"; 
      return View("Manage", "Roles"); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex); 
      return View("Manage"); 
     } 
    } 

Действие никогда не добавляют ролей для пользователя, и исключение гласит: «Роль„ADMIN“не существует.» без внутреннего исключения. Я попытался превратить RoleName в параметры действия в all-caps, но он все еще не находит эту роль. Я также попытался использовать идентификатор роли вместо имени, что также не увенчалось успехом.

Этот точный код работал, когда я создал это приложение с помощью Identity 3.0 с MVC 6. Кажется, что что-то изменилось при переходе к Identity Core.

Любые мысли?

Редактировать

Вот код, я использую для заполнения выпадающих списков в RolesController через Viewbag:

private void PrepopulateDropDownMenus() 
    { 
     var rolesList = _db.Roles.OrderBy(r => r.Name).ToList().Select(rr => new SelectListItem { Value = rr.Name.ToString(), Text = rr.Name }).ToList(); 
     var usersList = _db.Users.OrderBy(u => u.UserName).ToList().Select(uu => new SelectListItem { Value = uu.UserName.ToString(), Text = uu.UserName }).ToList(); 
     ViewBag.Roles = rolesList; 
     ViewBag.Users = usersList; 
    } 

Вот как я добавить идентичности в Startup.cs в ConfigureServices:

public void ConfigureServices(IServiceCollection services) 
    { 
     ... 
     services.AddEntityFramework() 
      .AddDbContext<ApplicationDbContext>(options => 
       options.UseSqlServer(Configuration["ConnectionStrings:DefaultConnection"])); 
     services.AddIdentity<ApplicationUser, IdentityRole>() 
      .AddEntityFrameworkStores<ApplicationDbContext>() 
      .AddDefaultTokenProviders(); 
    } 

Вот маршрут i п RolesController.cs Я использую, чтобы создать новую роль в базе данных:

[HttpPost] 
    public IActionResult Create(string rolename) 
    { 
      _db.Roles.Add(new IdentityRole() 
      { 
       Name = rolename 
      }); 
      _db.SaveChanges(); 
      ViewBag.ResultMessage = "Role created successfully!"; 
      return RedirectToAction("Index"); 
    } 

ответ

10

Я не могу комментировать еще спросить, так ли ваша ошибка сказать пользователь администратор не существует, или Роль не существует? Я попытался дублировать код на моем конце, и если пользователь не существует, вы получите ошибку «пользователь не может быть пустым». Однако, если роль не существует, вы получите сообщение об ошибке «Роль [роль] не существует».

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

 // Add the Admin role to the database 
     IdentityResult roleResult; 
     bool adminRoleExists = await _roleManager.RoleExistsAsync("Admin"); 
     if (!adminRoleExists) 
     { 
      _logger.LogInformation("Adding Admin role"); 
      roleResult = await _roleManager.CreateAsync(new IdentityRole("Admin")); 
     } 

     // Select the user, and then add the admin role to the user 
     ApplicationUser user = await _userManager.FindByNameAsync("sysadmin"); 
     if (!await _userManager.IsInRoleAsync(user, "Admin")) 
     { 
      _logger.LogInformation("Adding sysadmin to Admin role"); 
      var userResult = await _userManager.AddToRoleAsync(user, "Admin"); 
     } 

EDIT

Путь вы добавляете роли прямо сейчас оставляет NormalizedName в таблице ролей null, которая, как мне кажется, используется платформой для добавления ролей пользователям.Попробуйте выполнить одно из следующих действий, чтобы добавить роль в базу данных вместо того, что вы сейчас делаете:

var result = await _roleManager.CreateAsync(new IdentityRole(rolename)); 

Или это может также работать (не проверял этот, хотя):

[HttpPost] 
public IActionResult Create(string rolename) 
{ 
     _db.Roles.Add(new IdentityRole() 
     { 
      Name = rolename, 
      NormalizedName = rolename.ToUpper() 
     }); 
     _db.SaveChanges(); 
     ViewBag.ResultMessage = "Role created successfully!"; 
     return RedirectToAction("Index"); 
} 
+0

Спасибо для того, чтобы поймать это! Ошибка говорит: «Роль [роль] не существует». Я отредактировал свой вопрос. Я уже добавил роль в мою базу данных (в раскрывающемся списке записаны данные из таблицы «ролей»). Использует ли код, который вы включили в свой ответ, для вас? – jmk22

+0

Да, это фактический код, который я использую, чтобы засеять новую/пустую базу данных, но основы должны быть одинаковыми. Не могли бы вы разместить код, заполняющий список избранных? И как вы добавляете роль в базу данных для начала? – FranksBrain

+0

это интересно. Я добавил код в приведенное выше изменение. Я добавляю роль в базу данных в действие «Создать» в контроллере с помощью метода «Добавить» для базы данных. – jmk22

Смежные вопросы