【问题标题】:Custom FormsAuthenticationTicket validation自定义 FormsAuthenticationTicket 验证
【发布时间】:2012-03-28 00:11:38
【问题描述】:

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

  1. 同一个应用程序池
  2. 相同的机器密钥
  3. 相同的登录cookie名称

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

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

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

【问题讨论】:

  • 在子注释中,我添加了一个自定义 SessionIDManager 以查看是否有帮助,但这只有助于我的 sessionID 而不是我的登录 cookie。
  • 能否使用 Global.asax 中的 Application_AuthenticateRequest 事件 - 一些相关的 cmets 可能在这里:stackoverflow.com/questions/875472/authenticaterequest-event
  • asp.net 不对 cookie 进行 IP 检查的原因是因为这是一个非常愚蠢的想法。用户 IP 地址更改的情况太多了,例如使用移动设备时(这可能会随时更改)或用户动态 IP 更改时,或者存在共享代理池。另外,这不会阻止某人将 cookie 从防火墙后面的一台机器复制到同一防火墙后面的另一台机器上。您试图通过破坏用户使用该网站的能力来修复一个不太可能的漏洞,但它甚至无法正常工作!。
  • 更好的方法是简单地使用 SSL 进行 cookie 传输,然后保护传输中的 cookie。它不会阻止对机器具有物理或远程访问权限的人访问 cookie,但这是一般 cookie 中固有的问题。将 cookie 锁定到 IP 只是一种糟糕的做法。
  • 我同意@MystereMan,遗憾的是我们的 CMS 与 SSL 不兼容。可悲的是,我看到我的几个用户突然变成了黑客的中国 IP 地址,这不太可能。 SSL 对此没有帮助,因为我很确定我的用户感染了病毒和间谍软件,直接从他们的浏览器复制了 cookie。

标签: asp.net security authentication forms-authentication


【解决方案1】:

除了编写一个新的 FormsAuthenticationModule 之外,您不能覆盖 Authentication,但有一种更简单的方法。 在 ASP.NET 管道处理请求时,每一步都会引发一个事件,您可以在此处利用 ASP.NET 管道并完成您的工作。

在您的情况下,您可以在 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-27
    • 2017-10-03
    • 2011-04-15
    • 2014-10-04
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多