Роли ASP.NET не назначаются пользователям
У меня есть сайт, на котором я хочу провести различие между пользователями ASP.NET Identity и внешними пользователями, использующими роли.
Я создал свои роли, используя:
ApplicationDbContext.Roles.Add(new IdentityRole()
{
Name = "External"
});
ApplicationDbContext.Roles.Add(new IdentityRole()
{
Name = "Internal"
});
ApplicationDbContext.SaveChanges();
Эти роли добавляются в таблицу aspnetRoles правильно.
Затем в моем AccountController для внутренних пользователей я использую действие Register Post:
var user = new ApplicationUser { UserName = model.UserName, Email = model.Email };
result = await UserManager.CreateAsync(user, model.Password);
if (result.Succeeded)
{
UserManager.AddToRole(user.Id, "Internal");
string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
...
Который добавляет запись в таблицу aspnetUsers, а другую - в таблицу aspnetUserRoles с идентификатором пользователя, соответствующим новому пользователю, и идентификатором роли, соответствующим соответствующей роли.
Затем я делаю то же самое для моей внешней регистрации:
public async Task<ActionResult> ExternalLoginConfirmation(ExternalLoginConfirmationViewModel model, string returnUrl)
{
if (User.Identity.IsAuthenticated)
{
return RedirectToAction("Index", "Manage");
}
if (ModelState.IsValid)
{
// Get the information about the user from the external login provider
var info = await AuthenticationManager.GetExternalLoginInfoAsync();
if (info == null)
{
return View("ExternalLoginFailure");
}
var user = new ApplicationUser { UserName = model.userName, Email = model.Email };
var result = await UserManager.CreateAsync(user);
if (result.Succeeded)
{
UserManager.AddToRole(user.Id, "External");
result = await UserManager.AddLoginAsync(user.Id, info.Login);
if (result.Succeeded)
{
await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
return RedirectToLocal(returnUrl);
}
}
AddErrors(result);
}
ViewBag.ReturnUrl = returnUrl;
return View(model);
}
Что делает то же самое, создает пользователя в БД и добавляет соответствующие идентификаторы в таблицу UserRoles.
Тем не менее, когда я вхожу в систему с использованием любого метода и пытаюсь перейти к действию с [Authorize(Roles="Internal")]
или же [Authorize(Roles="External")]
Я не могу получить к ним доступ. Я добавил тест, используя ApplicationUser CurrentUser = UserManager.FindByName("MyUserName");
который успешно возвращает моего пользователя из базы данных, но когда я тогда говорю Console.WriteLine(CurrentUser.Roles);
CurrentUser.Roles
имеет счетчик 0, что делает вид, что роль была назначена неправильно.
Есть ли что-то, что я упустил в процессе назначения роли? Я не могу разобраться.
Благодарю.
Изменить ответ / Дальнейший вопрос...
При добавлении пользователей к ролям с использованием вышеуказанного, идентификатор пользователя добавляется в UserId
столбец UserRoles
таблица, но там был третий столбец с именем IdentityUser_Id
который всегда был нулевым.
Из любопытства я добавил в эту колонку свой идентификатор пользователя, и теперь все работает. приложение подхватило мою роль пользователя.
Мой следующий вопрос: могу ли я установить IdentityUser_Id
автоматически? используя что-то похожее на UserManager.AddToRole()
который добавляет userId в оба столбца?
Спасибо
1 ответ
Вот как выглядит мой похожий код. Я использую менеджер ролей для создания ролей:
var roleStore = new RoleStore<IdentityRole>(db);
var roleManager = new RoleManager<IdentityRole>(roleStore);
var userStore = new UserStore<ApplicationUser>(db);
var userManager = new UserManager<ApplicationUser>(userStore);
// Add missing roles
var role = roleManager.FindByName("External");
if (role == null)
{
role = new IdentityRole("External");
roleManager.Create(role);
}
role = roleManager.FindByName("Internal");
if (role == null)
{
role = new IdentityRole("Internal");
roleManager.Create(role);
}
// Create test users
var user = userManager.FindByName("admin");
if (user == null)
{
var newUser = new ApplicationUser()
{
UserName = "admin",
FirstName = "Admin",
LastName = "User",
Email = "xxx.xxx@xxx.net",
PhoneNumber = "5555559492",
MustChangePassword = false
};
userManager.Create(newUser, "Password1");
userManager.SetLockoutEnabled(newUser.Id, false);
userManager.AddToRole(newUser.Id, "Internal");
}
user = userManager.FindByName("limited");
if (user == null)
{
var newUser = new ApplicationUser()
{
UserName = "limited",
FirstName = "Limited",
LastName = "User",
Email = "limited@mypd.com",
PhoneNumber = "6085555556",
MustChangePassword = false
};
userManager.Create(newUser, "Password1");
userManager.SetLockoutEnabled(newUser.Id, false);
userManager.AddToRole(newUser.Id, "External");
}