【问题标题】:AspNetUserRoles empty after _UserManager.AddToRolesAsync() succeeds_UserManager.AddToRolesAsync() 成功后 AspNetUserRoles 为空
【发布时间】:2019-09-19 13:42:28
【问题描述】:

下面的代码让我很头疼。如您所见,我有一个非常标准的 AccountController 和“注册”方法。注册后,用户应被赋予“Module_All__Admin”角色。代码似乎正确,“resultAssigningRole.Succeeded”返回 true...为什么我的 SQL 数据库中的“AspNetUserRoles”表为空?

注意:连接字符串工作正常,在一个单独的控制器中我填写了“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");
        }

    }

编辑 大家,这似乎是 ASP.NET CORE 中的一个错误。我在 github 中发现,确保您的服务设置为这样可以解决这种情况:

        services.AddIdentity<IdentityUser, IdentityRole>()
                   .AddEntityFrameworkStores<ApplicationDbContext>()
                   .AddDefaultUI()
                   .AddDefaultTokenProviders();

它对我有用。

【问题讨论】:

标签: asp.net-core


【解决方案1】:

在您调用_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
                    {
                        ...

【讨论】:

  • schough,我刚刚找到了解决方案 - 似乎是我的 Setup.cs 是如何完成的。我回到了旧的做法,它奏效了。
  • 太棒了。很高兴您对其进行了排序
猜你喜欢
  • 2014-09-30
  • 1970-01-01
  • 2018-10-20
  • 2014-05-03
  • 1970-01-01
  • 2021-01-14
  • 2021-04-16
  • 2023-03-08
  • 1970-01-01
相关资源
最近更新 更多