Роли 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");
            }
Другие вопросы по тегам