Следующий код вызывает у меня головную боль. Как видите, у меня есть довольно стандартный AccountController с методом «Register». При регистрации пользователю должна быть предоставлена роль «Module_All__Admin». Код кажется правильным и «resultAssigningRole.Succeeded» возвращает true ... почему тогда моя таблица «AspNetUserRoles» в базе данных SQL пуста?
Примечание: строка подключения работает нормально, в отдельном контроллере я заполнил таблицу "AspNetRoles", и она заработала.
public class AccountController : Controller
{
private readonly UserManager<IdentityUser> _userManager;
private readonly SignInManager<IdentityUser> _signInManager;
private readonly RoleManager<IdentityRole> _roleManager;
private readonly ILogger _logger;
private readonly IEmailSender _emailSender;
public AccountController(
UserManager<IdentityUser> userManager,
SignInManager<IdentityUser> signInManager,
RoleManager<IdentityRole> roleManager,
ILoggerFactory loggerFactory,
IEmailSender emailSender
)
{
_userManager = userManager;
_signInManager = signInManager;
_roleManager = roleManager;
_logger = loggerFactory.CreateLogger<AccountController>();
_emailSender = emailSender;
}
public async Task<IActionResult> Register(LoginViewModel loginViewModel)
{
if (ModelState.IsValid)
{
IdentityUser user = new IdentityUser() { UserName = loginViewModel.Email };
IdentityResult resultCreatingUser = await _userManager.CreateAsync(user, loginViewModel.Password);
if (resultCreatingUser.Succeeded) //this returns true
{
if (await _roleManager.RoleExistsAsync("Module_All__Admin"))
{
IdentityResult resultAssigningRole = await _userManager.AddToRoleAsync(user, "Module_All__Admin");
if (resultAssigningRole.Succeeded) //this returns true
{
await _signInManager.SignInAsync(user, isPersistent: false);
_logger.LogInformation(3, "User created, assigned to role 'AllModules - User'");
}
else
{
var errors = resultAssigningRole.Errors;
var message = string.Join(", ", errors);
ModelState.AddModelError("", message);
}
}
return RedirectToAction("LoggedIn", "Account");
}
}
return View("~/Views/Home/Index.cshtml");
}
}
EDIT
Всем кажется, что это ошибка в ASP.NET CORE. В github я обнаружил, что обеспечение того, чтобы ваши сервисы были настроены следующим образом, решает ситуацию:
services.AddIdentity<IdentityUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultUI()
.AddDefaultTokenProviders();
Это сработало для меня.