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
}

谢谢你抽出时间来看我的问题!

MVC5注册新用户,分配角色并激活具有角色的用户,而无需使用:await UserManager.AddToRoleAsync(user.Id,"role Name")注销和重新登录

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

@kevinjunghans你的答案让我找到正确的答案。这段代码展示了如何在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);

ASP.NET Identity使用声明来存储角色,并在每次需要执行授权时使用声明,而不是执行数据库查询。因此,在该人员再次登录之前,这些角色不会出现在索赔中。您可以在此处阅读有关在ASP.NET Identity中使用声明的信息。这些文章展示了如何在登录过程中添加声明。但是,如果您为当前用户添加了一个角色,您可以使用我对该QA的回答中描述的方法更新声明,而无需强迫用户再次登录。分配给用户的每个角色都有一个声明。添加新角色时请使用ClaimTypes.Role。

向当前用户添加角色后,您可以更新声明,而无需强制用户注销并再次登录。

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

参考的等效C#代码:

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

相关内容

  • 没有找到相关文章

最新更新