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));