我发现,如果我在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));