如何在请求的早期使错误的身份验证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

回到顶部