【发布时间】: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