在ASP.NET标识框架中更改时刷新当前用户的角色?

Old*_*zer 8 asp.net-mvc roleprovider asp.net-identity

使用VS 2013,标准MVC模板和身份提供程序框架

用户已登录,我有:

//....
UserManager.AddToRole(User.Identity.GetUserId(), "Members");       # Line X
RedirectToAction("Index", "Members");
Run Code Online (Sandbox Code Playgroud)

会员控制员如下:

[Authorize(Roles="Members")]
public class MembersController : Controller
{
    // GET: Members
    public ActionResult Index()
    {
        return View();
    }
}
Run Code Online (Sandbox Code Playgroud)

执行第X行后,我可以确认用户已添加到表中dbo.AspNetUserRoles.但是,用户在到达成员控制器时未通过角色检查. User.IsInRole("Members")返回false.

如果用户注销然后再次登录,则将访问"成员"控制器,即User.IsInRole("Members")现在返回true.

有缓存吗?为何延误?我该如何克服它?

我也尝试将第X行的方法转换为异步方法并使用UserManager.AddToRoleAsync.同样的延迟效应仍然存在.

tmg*_*tmg 21

当用户登录时,身份信息(角色,声明)将被放入cookie中.由于用户已经登录,因此这行代码UserManager.AddToRole(User.Identity.GetUserId(), "Members")将更新数据库,但不会更新cookie.您必须重新发布cookie.

尝试添加SignInManager.SignIn(user, false, false);(如果你没有用户var user = UserManager.FindById(User.Identity.GetUserId())),之前RedirectToAction("Index", "Members");

  • 这实际上应该是Role.AddUserToRole()方法应该解释的内容.或者"小心!" 文档中的框. (2认同)
  • 1个问题:大多数角色是由其他人分配的,是否有一种简单的方法可以使用Identity向用户发送一种通知来刷新他的cookie? (2认同)