AspNetUserRoles пустые после _UserManager.AddToRolesAsync () успешно - PullRequest
1 голос
/ 01 мая 2019

Следующий код вызывает у меня головную боль. Как видите, у меня есть довольно стандартный 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();

Это сработало для меня.

1 Ответ

0 голосов
/ 01 мая 2019

После вызова _userManager.CreateAsync(... у вашего user объекта есть Id?

Если нет, попробуйте это.Он выйдет и получит нового пользователя из БД через имя пользователя (или по электронной почте, если вы предпочитаете) и используйте Id из этого для назначения роли.

            ...
            if (resultCreatingUser.Succeeded) //this returns true
            {
                if (await _roleManager.RoleExistsAsync("Module_All__Admin"))
                {
                    //Retrieve the user from the database by userName (or Email if unique)
                    var _newUser = await _userManager.FindByNameAsync(user.userName)

                    IdentityResult resultAssigningRole = await _userManager.AddToRoleAsync(_newUser, "Module_All__Admin");
                    if (resultAssigningRole.Succeeded) //this returns true
                    {
                        ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...