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

问题描述 投票:0回答:2

使用 VS 2013、标准 MVC 模板和身份提供者框架

用户已登录,我有:

//....
UserManager.AddToRole(User.Identity.GetUserId(), "Members");       # Line X
RedirectToAction("Index", "Members");

Members控制器如下:

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

第 X 行执行后,我可以确认用户已添加到表中

dbo.AspNetUserRoles
。但是,用户在到达成员控制器时未通过角色检查。
User.IsInRole("Members")
返回 false。

如果用户注销然后再次登录,则将访问 Members 控制器,即

User.IsInRole("Members")
现在返回 true。

有缓存吗?为什么延迟?我该如何克服它?

我还尝试将 X 行的方法转换为异步方法并使用

UserManager.AddToRoleAsync
。同样的延迟效果仍然存在。

asp.net-mvc asp.net-identity roleprovider
2个回答
30
投票

用户登录时,身份信息(角色、声明)被放入 cookie 中。由于用户已经登录,因此这行代码

UserManager.AddToRole(User.Identity.GetUserId(), "Members")
将更新 db ,但不会更新 cookie。您必须重新发出 cookie。

尝试在

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


0
投票

@tmg 接受的答案有问题。

SignInManager.SignInAsync(user)
仅更新分配角色的用户的 cookie,而不更新分配给角色的用户。

如果您希望更新该用户的cookie,您必须以某种方式实现用户执行的

SignInAsync
命令。就像将命令放置到主页一样。

不用说这不是一个确定的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.