【问题标题】:How to refresh current authenticated user's role changed membership in ASP.NET identity framework?如何在 ASP.NET 身份框架中刷新当前经过身份验证的用户的角色更改成员身份?
【发布时间】:2015-07-09 07:59:22
【问题描述】:

我在 ASP MVC 5 应用程序中使用 ASP.NET 身份框架。在某些情况下,当前用户的角色成员资格正在发生变化,例如:

a) 用户进行了付款,因此将其从 TrialUsers 中删除并添加到 Users(或任何类似的订阅更改,例如从 Standard 变为 Premium。

b) 对于站点管理员,有一个明确的 UI,他们可以在其中编辑角色成员资格。

编辑

与此同时,我发现了一个用例,它不仅带来不便,而且还存在安全漏洞,并且使授权无法使用。

c) 不识别角色成员资格更改适用于身份框架的“记住我”功能。这意味着如果用户使用了记住我功能(请不要建议我不要为我的用户提供此功能),那么角色成员资格更改将永远不会应用。 (记忆到期)这意味着我不能有效地撤销任何会员资格。这意味着我不能使用授权子系统(比如我的控制器或操作方法上的属性),我们又回到了石器时代:if(...)

结束编辑

所有更改都通过使用提供的标准 API 完成:

UserManager.AddToRolesAsync(...);

UserManager.RemoveFromRolesAsync(...);

授权子系统和/或身份子系统似乎在用户下次登录之前无法识别更改。特别是在场景 a) 要求付费用户退出并登录非常不方便。正如我所见ASP MVC 授权系统没有检测到角色变化没有注销->登录。

请注意,我知道某些授权系统(如 Windows)以这种方式工作。仍然希望身份框架中有一个解决方案,可以跳过强制用户注销->登录。

是否有任何解决方法,或者错过了什么?

【问题讨论】:

  • 有一个解决方案。您必须重新发布 cookie。检查stackoverflow.com/questions/29285406/…
  • @tmg:谢谢。同时,我还诊断出这是与 cookie 相关的事情,请参阅我对同样基于 cookie 的“记住我”的编辑。阅读您指出的问题/答案。
  • @tmg:是的,它有效。有点复杂,因为我想在场景 b) 和 c) 中将角色更改应用于 other 用户而不是当前用户,但我设法在 ApplicationUser 中的一个标志中解决了它。但是,如果我使用固定的 isPersist = false 参数调用 SignInManager.SignIn(user, false, false) 会产生副作用,用户的 cookie KeepMeSignedIn 会重置为 false。有什么方法可以获取当前用户的最后一个 isPersist 登录设置(除了琐碎:在每次登录的自定义 ApplicationUser 字段中记住它)这超出了主题,所以我为此创建了一个单独的问题,
  • @tmg:您的评论绝对是一个“答案”,所以如果您将其复制为答案,我将接受作为答案。再次感谢。

标签: c# asp.net asp.net-mvc asp.net-identity asp.net-identity-2


【解决方案1】:

只需再次登录用户即可重建用户cookie:

SignInManager.SignIn(user, false, false);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 2012-04-10
    相关资源
    最近更新 更多