ASP.NET身份验证框架中,当当前用户角色发生变化时如何刷新?

16

使用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中。但是,在到达Members控制器时,用户未通过角色检查。User.IsInRole("Members")返回false。
如果用户注销并重新登录,则可以访问Members控制器,即User.IsInRole("Members")现在返回true。
是否存在某种缓存?为什么会有延迟?如何解决它?
我还尝试将X行的方法转换为异步方法,并使用UserManager.AddToRoleAsync。仍然存在相同的延迟效应。
1个回答

30
当用户登录时,身份信息(角色、声明)会被放入cookie中。由于用户已经登录,所以这段代码 UserManager.AddToRole(User.Identity.GetUserId(), "Members")将会更新数据库,但不会更新cookie。你需要重新发放cookie。
RedirectToAction("Index", "Members"); 之前尝试添加 SignInManager.SignIn(user, false, false); (如果没有用户,则使用 var user = UserManager.FindById(User.Identity.GetUserId()))来重新发放cookie.

2
这实际上应该是Role.AddUserToRole()方法中需要解释的内容。或者在文档中加入一个“注意!”提示框。 - juli0r
6
大多数角色都是由其他人分配的,是否有一种简单的方法可以使用身份验证向用户发送一种通知来刷新他的Cookie? - CularBytes
如果我们需要在我们的网站上实现基于角色的订阅(即..用户购买订阅后,我们需要显示额外的特权而无需登录),这将充分利用@CularBytes。 - Biju Kalanjoor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接