如何在请求的早期使错误的身份验证cookie失效?
场景
我开发了一个将在Windows Azure中托管的MVC应用程序。在开发过程中,我会针对本地数据库和本地用户会员服务进行测试。在生产环境中,应用程序关闭SQL Azure数据库和云托管的用户成员资格服务。如何在请求的早期使错误的身份验证cookie失效?
有时我会登录到本地版网站与用户帐户只有存在我的本地机器上。如果我忘记注销,但将我的机器退出测试模式,则情况开始中断。
的问题
设置我hosts
文件在127.255.0.0
使浏览器请求由本地Azure的仿真处理指向我的应用程序URL。这也意味着我的测试应用程序和生产应用程序使用相同的主机名 - 其中一个的cookie被视为另一个的有效cookie。
如果我登录到本地系统,则会为该域创建一个ASPXAUTH
cookie,并且该cookie包含来自本地系统的用户凭据。如果我忘记注销并将我的hosts
文件恢复正常(浏览器请求转到实时应用程序),它会将相同的ASPXAUTH
Cookie发送到服务器。
由于此用户在服务器上不存在,只有在本地,Membership.GetUser().Email
之类的任何请求都会返回对象空异常。
我想做
理想情况下,我可能早注入一些代码的要求,以检查用户是否存在。例如:
MembershipUser user = Membership.GetUser(); if(user == null) {
FormsAuthentication.SignOut();
}
这将自动删除无效用户的ASPXAUTH
Cookie。但我在哪里放?我开始看着我的控制器 - 它们都是从BaseController
类继承而来,但是即使将这些代码放在基本控制器的构造函数中也不够早。我也看过Global.asax
,但我不确定哪个事件最适合将此操作绑定到。
另外,我甚至不确定这是做事的正确方法。如果没有,在取决于像我目前那样的成员类之前,确保身份验证Cookie是针对有效用户的最佳方式是什么?
回答:
您可以处理以下事件中你global.aspx:
public void FormsAuthentication_OnAuthenticate(object sender, FormsAuthenticationEventArgs args) {
}
编辑:
在above method,Membership.GetUser()
将返回null
,因为它采用用户名从HttpContext.Current.User.Identity.Name
属性,并以这个事件用户还没有被认证。上述方法在调用Authenticate时调用FormsAuthenticationModule。您可以处理此事件,像这样:
public void FormsAuthentication_OnAuthenticate(object sender, FormsAuthenticationEventArgs args) {
if (FormsAuthentication.CookiesSupported &&
Request.Cookies[FormsAuthentication.FormsCookieName] != null)
{
try
{
var formsAuthTicket = FormsAuthentication.Decrypt(Request.Cookies[FormsAuthentication.FormsCookieName].Value);
MembershipUser user = Membership.GetUser(formsAuthTicket.Name);
if (user == null)
{
FormsAuthentication.SignOut();
Request.Cookies[FormsAuthentication.FormsCookieName].Value = null;
}
}
catch (Exception ex)
{
//TODO:log ex
}
}
}
你也可以考虑通过宣布在global.aspx下面的方法来处理事件AuthenticateRequest。
注:Application_AuthenticateRequest事件的FormsAuthentication_OnAuthenticate事件之后被解雇。
void Application_AuthenticateRequest(object sender, EventArgs e) {
if (HttpContext.Current.User != null && HttpContext.Current.User.Identity.IsAuthenticated)
{
MembershipUser user = Membership.GetUser();
if (user == null)
{
FormsAuthentication.SignOut();
HttpContext.Current.User = null;
}
}
}
希望这有助于..
回答:
您创建一个基本的控制器,它覆盖OnActionExecuting
,把你的代码存在。 让你的所有控制器控制器都从他那里继承。这从旧项目的OnActionExecuting
我
protected override void OnActionExecuting(ActionExecutingContext filterContext) {
if (Request.IsAuthenticated)
{
if (Session[SomeKey] == null)
{
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary { { "controller", "Account" }, { "action", "LogOff" } });
}
}
base.OnActionExecuting(filterContext);
}
我基本上检查,如果该请求被以其他方式证实我把它重定向到注销行动。 http://msdn.microsoft.com/en-us/library/system.web.mvc.controller.onactionexecuting.aspx
以上是 如何在请求的早期使错误的身份验证cookie失效? 的全部内容, 来源链接: utcz.com/qa/257712.html