我使用MVC(4)与Identity(2.0)和我的webapp有一个页面管理员来管理用户。
管理员的一个功能是不活动(冻结)用户帐户,我实现它的方式:
在我的数据库中添加一个名为'Active'的字段,如果管理员停用用户,则字段值为'0'。
为了不检查我网站的每个页面中的每个用户,只有在用户试图登录时才这样做,所以在我让他登录之前,我检查了这个字段。
但是现在我有问题了:
用例示例:管理员停用用户"x"的帐户,10分钟后用户"x"进入网站,网站"记住"他,不要求他登录,所以我的检查将永远不会发生。
如果网站是"记住"用户,而不是要求他登录,我就有麻烦了,我需要以某种方式注销用户。
我读了关于cookie和安全戳的文章,我的结论是:
我需要更改用户的安全戳,以防止站点"记住"用户并允许他不登录。
第一件事:我做对了吗?更改用户的安全戳,网站就不会记住他了吗?
第二件事:我注意到安全戳是一个guid,所以我可以以编程方式生成并插入到用户的安全戳字段,是吗?没有?为什么?
如果你对整个事情有更好的实现…我很乐意听你说:)
Update:也许如果我更改数据库中用户的某些字段(我不使用的字段,如电话),它将自动更新安全戳?
Update2:即使我手动生成GUID并将其放在安全戳字段(在DB上),它也不会强制用户注销
我已经使用javascript让注销发生
<a href="javascript:document.getElementById('logoutForm').submit()"><i class="glyphicon glyphicon-log-out"></i> Log off</a>
即使用户被浏览器记住了,他仍然需要被授权。您总是可以在授权而不是身份验证时执行此检查。这样,即使用户在浏览网站的过程中,管理员冻结了该帐户,他的浏览也将无法继续,因为在下一次授权时,他将被注销,无法重新登录。
验证:这个人是谁,他真的是他声称的那个人吗?
Authorization:登录人员是否被授权执行此操作或访问此资源?
正如James在评论中建议的那样,我也同意这可以作为角色或声明来实现。与Asp一起调查索赔。Net Identity,我相信您会发现解决方案更加优雅和灵活。