自定义FormsAuthenticationTicket验证

时间:2012-03-28 00:11:38

标签: asp.net security authentication forms-authentication

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

  1. 相同的应用程序池
  2. 相同的机器密钥
  3. 相同的登录Cookie名称
  4. 我的问题是他们也分享安全问题,没有cookie欺骗保护。 我的计划是在登录cookie中添加一些额外的信息(前2个字节的ip,用户代理)(可能在useradata字段中),然后在接受cookie之前在每个请求上验证这一点。

    我的问题是asp.net在哪里检查表单身份验证票证并加载用户,在使用登录之前我可以覆盖它以检查一些额外的事情。

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

1 个答案:

答案 0 :(得分: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