设想
我开发了一个将托管在 Windows Azure 中的 MVC 应用程序。在开发过程中,我针对本地数据库和本地用户会员服务进行测试。在生产中,该应用程序使用 SQL Azure 数据库和云托管的用户会员服务。
有时我会使用仅存在于我的本地计算机上的用户帐户登录到站点的本地版本。如果我忘记注销但将机器退出测试模式,事情就会开始中断。
问题
我将hosts
文件设置为指向我的应用程序 URL,127.255.0.0
以便 Azure 模拟器在本地处理浏览器请求。这也意味着我的测试应用程序和生产应用程序使用相同的主机名 - 一个的 cookie 被视为另一个的有效 cookie。
如果我登录到本地系统,则会ASPXAUTH
为域创建一个 cookie,其中包含来自本地系统的用户凭据。如果我忘记注销并将我的hosts
文件切换回正常状态(浏览器请求转到实时应用程序),它会将相同的ASPXAUTH
cookie 发送到服务器。
由于该用户在服务器上不存在,仅在本地存在,因此任何请求都Membership.GetUser().Email
返回对象空异常。
我想做的事
理想情况下,我可以在请求的早期注入一些代码来检查用户是否存在。就像是:
MembershipUser user = Membership.GetUser();
if(user == null) {
FormsAuthentication.SignOut();
}
这将自动删除ASPXAUTH
无效用户的 cookie。但是我把它放在哪里?我开始研究我的控制器——它们都继承自一个BaseController
类,但即使将这段代码放在基本控制器的构造函数中也不够早。我也查看了Global.asax
,但我不确定哪个事件最适合将此操作绑定到。
另外,我什至不确定这是做事的正确方法。如果不是,那么在仅取决于我目前的会员类别之前,确保身份验证 cookie 适用于有效用户的最佳方法是什么?