如何在ASP.NET身份验证框架中刷新当前已认证用户的角色更改成员资格?

6
我正在一个ASP MVC 5应用程序中使用ASP.NET身份验证框架。在某些情况下,当前用户的角色成员身份会发生变化,例如:
a)用户进行了付款,因此从试用用户中删除并添加到用户(或任何类似的订阅更改,比如从标准版升级到高级版)。
b)对于站点管理员,有一个明确的UI,他们可以编辑角色成员身份。
编辑
同时,我发现了一个不仅是不便而且是安全漏洞的用例,并使授权无法使用。
c)不识别角色成员身份更改适用于身份验证框架的“记住我”功能。这意味着如果用户使用了记住我功能(请不要建议我不为我的用户提供此功能),则永远不会应用角色成员身份更改。(记忆的过期时间)这意味着我无法有效地撤销任何成员身份。这意味着我无法使用授权子系统(例如我的控制器或操作方法上的属性),我们回到了石器时代:if(...)
所有更改都是通过使用提供的标准API完成的。
UserManager.AddToRolesAsync(...);

并且

UserManager.RemoveFromRolesAsync(...);

似乎授权子系统和/或身份子系统在用户下次登录前无法识别更改。 尤其是在方案a)中,要求付费用户注销并重新登录非常不方便。我发现ASP MVC授权系统在未注销-重新登录的情况下无法检测到角色更改。
请注意,我知道一些授权系统(例如Windows)是以这种方式工作的。 仍然希望在Identity框架中有解决方案可以跳过强制用户注销-重新登录的步骤。
是否有任何解决方法或者我漏掉了什么?

3
有一个解决方案。你需要重新发放cookie。请查看https://dev59.com/6V4b5IYBdhLWcg3wVwJi#29286361。 - tmg
@tmg:谢谢。同时我也诊断出这是一个与cookie相关的问题,请查看我的有关“记住我”的编辑,该功能同样基于cookies。我正在阅读你指向的问题/答案。 - g.pickardou
@tmg:是的,它可以工作。有点复杂,因为我想将其应用于场景b)和c)中当前用户以外的“其他”用户的角色更改,但我在ApplicationUser中使用标志解决了这个问题。然而,如果我使用固定的isPersist = false参数调用SignInManager.SignIn(user, false, false),则用户的cookie KeepMeSignedIn会被重置为false。除了通过在每次登录时记住它在自定义的ApplicationUser字段中来记住它(这很琐碎),是否有任何方法可以获取当前用户的最后一个isPersist登录设置?这超出了主题范围,所以我为此创建了一个单独的问题。 - g.pickardou
@tmg:你的评论绝对是一个“答案”,所以如果你将其复制为答案,我会接受它作为答案。再次感谢。 - g.pickardou
1个回答

2

只需重新登录用户以重建用户cookie:

SignInManager.SignIn(user, false, false);

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