2012-03-28 105 views
0

我有一个网站,承载许多asp.net应用程序。有些是用MVC2编写的,有些是用MVC3编写的,有些不是内部编写和二进制部署的(虽然我们可以找到源代码),还有许多是用ASP.Net 2.0 webforms编写的。在所有这些网站中,我们使用来自登录应用程序的单个登录页面。我们能做到这一点,因为所有的应用程序共享:自定义FormsAuthenticationTicket验证

  1. 同一个应用程序池
  2. 同一台机器关键
  3. 相同的登录cookie名

我的问题是,他们也分享了安全问题,没有cookie欺骗保护。 我的计划是在登录cookie(可能位于useradata字段)中添加一些额外的信息(前两个字节的ip,用户代理),然后在接受cookie之前在每个请求上验证该信息。

我的问题是,asp.net检查窗体身份验证票并加载用户,我可以覆盖此检查一些额外的东西,然后再使用登录。

这将是一个加号,如果我不必将此代码添加到每个global.cs中,并且可以将它放在某个dll中并在配置文件中引用该dll。

+0

在子笔记我添加了一个自定义的SessionIDManager,看看是否会帮助,但只有我的会话ID不是我的登录cookie帮助。 – Jeff 2012-03-28 00:12:37

+0

你可以在Global.asax中使用Application_AuthenticateRequest事件 - 一些相关的注释可能在这里:http://stackoverflow.com/questions/875472/authenticaterequest-event – SilverlightFox 2012-03-30 08:07:19

+1

asp.net不对cookie进行IP检查的原因是因为它是一个非常愚蠢的想法。用户IP地址变化的条件太多,比如使用移动设备时(这可能会改变),或者用户动态IP发生变化,或者有共享代理池。另外,这并不妨碍某人将cookie从防火墙后的一台机器复制到同一防火墙后面的另一台机器。您正试图通过打破用户使用该网站的能力来修复一个不太可能发生的漏洞,而且它甚至无法正常工作! – 2013-08-09 02:47:09

回答

0

除了编写新的FormsAuthenticationModule之外,您不能覆盖验证,但有一种更简单的方法。当ASP.NET管道处理请求时,在每个步骤中,都会引发一个事件,这是您可以利用ASP.NET管道进行工作的地方。

ASP.NET pipeline Authentication & Authorization steps

在你的情况,你可以在PostAuthenticateRequestHandler事件处理程序验证您的Cookie。

HttpCookie authCookie = Context.Request.Cookies["YourFormsCookieName"]; 
if (IsValidAuthCookie(authCookie)) 
{ 
    // do some stuff 
} 
else 
{ 
    // expire cookie using FormsAuthentication.Signout() 
    // do some stuff 
} 

这是一个有用的链接:Forms Authentication