我正在向我的AspNetUsers
表添加自定义Disabled
列,以便管理员可以临时禁用某个帐户。 (它看起来像LockoutEndDateUtc
不能正常工作,因为我需要。)到期用户会话(当前用户除外)
但是,如果管理员在用户登录时禁用帐户会怎么样?我不想检查当前用户帐户是否在每个请求上都被禁用,我正在寻找一种方法来终止该用户的会话,以便下一个请求将要求他们登录。
我相信这是由一个曲奇饼。这可能吗?
我正在向我的AspNetUsers
表添加自定义Disabled
列,以便管理员可以临时禁用某个帐户。 (它看起来像LockoutEndDateUtc
不能正常工作,因为我需要。)到期用户会话(当前用户除外)
但是,如果管理员在用户登录时禁用帐户会怎么样?我不想检查当前用户帐户是否在每个请求上都被禁用,我正在寻找一种方法来终止该用户的会话,以便下一个请求将要求他们登录。
我相信这是由一个曲奇饼。这可能吗?
其实这可以自动完成。在用户存储中的ASP.NET Identity中,有一个名为SecurityStamp
的属性。当你改变这个时,用户被强制重新认证下一个请求。这是因为该字段用于生成身份验证令牌(在您的情况下为cookie)。该框架内置了用于直接更改该方法的方法,或者直接或间接地更改该方法。一个很好的例子是什么时候间接改变了身份的密码是通过框架更新的(即呼叫UpdatePassword
或RemovePasswordAsync
),或者当为身份启用2因素身份验证时。
更改安全标记的方法可以在UserManager
中找到,称为UpdateSecurityStampAsync。从文档:
为用户生成新的安全印记,用于SignOutEverywhere功能。
听起来很有趣。去尝试和研究这个。 –
当用户更改密码强制从所有位置注销时,安全戳也会更新。 –
@MartinLiversage - 正确,也许我的措辞不清楚?让我看看我是否可以重新... ... – Igor
看起来像你需要一些代码在每个请求上执行。这是'Application_BeginRequest'的用途。在那里写代码来检查用户的状态,然后在他们被禁用时将其注销。看起来很简单。请注意,你会希望这是一个非常快速的检查,因为它会发生每个请求。 – mason
@mason:是的,我考虑过。这可能是一种合理的回退方式。尽管如此,这里还是会有小幅的表现。我有点希望能更好地理解跟踪用户会话的人可能会知道一种方法来使其失效。 –
没有什么魔法会自动注意到你翻转了数据库中的一个字段,从而将用户注销。你需要自己编写代码。如果你想让支票发生每一个请求,那就是你做的地方。我*假设*您可以进行AJAX轮询或SignalR或某事来监视用户的状态,并侦听某种“用户禁用”事件从服务器推送。您需要运行后台进程才能发出通知。再一次,你必须接线,而不是开箱即用。 – mason