使用VS 2013,标准MVC模板和身份提供程序框架
用户已登录,我有:
//....
UserManager.AddToRole(User.Identity.GetUserId(), "Members"); # Line X
RedirectToAction("Index", "Members");
会员控制器如下:
[Authorize(Roles="Members")]
public class MembersController : Controller
{
// GET: Members
public ActionResult Index()
{
return View();
}
}
执行第X行后,我可以确认用户已添加到表dbo.AspNetUserRoles
中。但是,用户在到达成员控制器时未通过角色检查。 User.IsInRole("Members")
返回false。
如果用户注销然后再次登录,则会访问“成员”控制器,即User.IsInRole("Members")
现在返回true。
有缓存吗?为何延误?我该如何克服它?
我也尝试将第X行的方法转换为异步方法并使用UserManager.AddToRoleAsync
。同样的延迟效应仍然存在。
答案 0 :(得分: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");
)