我发现如果我将用户添加到ASP身份中的角色,则在我退出并重新登录之前它不会生效。我是否需要做一些事情来刷新用户的角色而不强迫用户先注销?
以下是我将用户添加到角色的方式。
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
}
感谢您花时间看我的问题!
答案 0 :(得分:8)
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);
答案 1 :(得分:6)
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);
答案 2 :(得分:5)
ASP.NET Identity使用声明来存储角色并使用声明,而不是每次需要执行授权时执行数据库查询。因此,在此人再次登录之前,角色不会出现在声明中。你可以阅读using claims in ASP.NET Identity here。这些文章介绍了如何在登录过程中添加声明。但是,如果您向当前用户添加角色,则可以更新声明using the method described in my answer to this QA,而无需强制用户再次登录。分配给用户的每个角色都有一个声明。添加新角色时使用ClaimTypes.Role。
答案 3 :(得分:2)
向当前用户添加角色后,您可以更新声明,而无需强制用户注销并重新登录。
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));