MVC 5 AddToRole требует выхода из системы до того, как он будет работать?

Я нахожу, что если я добавлю пользователя в роль в ASP Identity, он не вступает в силу до тех пор, пока я не выйду из системы и не войду в систему. Есть ли что-то, что мне нужно сделать, чтобы обновить роли пользователя, не заставляя сначала выйти из системы?

Вот как я добавляю пользователя к роли.

var userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()));
var userId = HttpContext.Current.User.Identity.GetUserId();

userManager.AddToRole(userId, roleName);

Затем, почти сразу, я перенаправляю пользователя к этому методу действия. Я могу сказать в базе данных, что меня добавили в правильную роль, но MVC по-прежнему перенаправляет меня на страницу входа. Однако, если я выйду из системы, зайдите в систему и попытайтесь перейти к этому методу действий, все будет хорошо.

    [Authorize(Roles = RecoveryStandardRoles.ServiceProvider)]

    public partial class CertifyController : Controller

{
    #region Public Methods and Operators

    public virtual ActionResult CompanyProfile()
    {
        return this.View();
    }

    #endregion
}

Спасибо, что нашли время, чтобы посмотреть на мой вопрос!

Ответ 1

MVC5 зарегистрировать нового пользователя, назначить роль и активировать пользователя с ролью БЕЗ выхода из системы и обратно, используя: wait UserManager.AddToRoleAsync(user.Id, "Имя роли" )

if (ModelState.IsValid)
{
    var user = new ApplicationUser() { UserName = model.Email, Email = model.Email,StandName = model.StandName,FirstName = model.FirstName,LastName = model.LastName,CellPhone = model.CellPhone,Supervisor = model.Supervisor};
    IdentityResult result = await UserManager.CreateAsync(user, model.Password);

    var roleStore = new RoleStore<IdentityRole>(context);
    var roleManager = new RoleManager<IdentityRole>(roleStore);

    var userStore = new UserStore<ApplicationUser>(context);
    var userManager = new UserManager<ApplicationUser>(userStore);


    if (result.Succeeded)
    {
         ***await UserManager.AddToRoleAsync(user.Id, "Users Tammy");***
         await SignInAsync(user, isPersistent: false);

Ответ 2

@kevin-junghans, ваш ответ привел меня к правильному ответу. В этом коде показано, как добавить пользователя в роль в MVC 5 и автоматически активировать эту роль.

var userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()));
var userId = HttpContext.Current.User.Identity.GetUserId();

userManager.AddToRole(userId, roleName);

var authenticationManager = HttpContext.Current.GetOwinContext().Authentication;

authenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);

var user = userManager.FindById(userId);
var identity = userManager.CreateIdentity(user, DefaultAuthenticationTypes.ApplicationCookie);

authenticationManager.SignIn(new AuthenticationProperties { IsPersistent = false }, identity);

Ответ 3

Идентификатор ASP.NET использует заявки для хранения ролей и использует заявки вместо того, чтобы выполнять запрос базы данных каждый раз, когда ему нужно выполнить авторизацию. Таким образом, роли не будут в претензиях, пока пользователь не войдет в систему снова. Вы можете прочитать с использованием претензий в Identity ASP.NET здесь. В статьях показано, как добавлять претензии во время процесса входа в систему. Но если вы добавите роль текущему пользователю, вы можете обновить формулы используя метод, описанный в ответе на этот QA, не заставляя пользователя снова входить в систему. Существует претензия в отношении каждой роли, назначенной пользователю. Используйте ClaimTypes.Role при добавлении новой роли.

Ответ 4

После добавления роли к текущему пользователю вы можете обновить претензии без принуждения пользователя выйти из системы и снова войти в систему.

Dim owinAuth = HttpContext.Current.GetOwinContext().Authentication
Dim authResult = Await owinAuth.AuthenticateAsync(Microsoft.AspNet.Identity.DefaultAuthenticationTypes.ApplicationCookie)

authResult.Identity.AddClaim(New System.Security.Claims.Claim(System.Security.Claims.ClaimTypes.Role, "RoleName"))

Эквивалентный код С# для справки:

var owinAuth = HttpContext.Current.GetOwinContext().Authentication;

var authResult =
    await owinAuth.AuthenticateAsync(Microsoft.AspNet.Identity.DefaultAuthenticationTypes.ApplicationCookie);

authResult.Identity.AddClaim(new System.Security.Claims.Claim(System.Security.Claims.ClaimTypes.Role, roleName));