Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 自定义表单身份验证票证验证_Asp.net_Security_Authentication_Forms Authentication - Fatal编程技术网

Asp.net 自定义表单身份验证票证验证

Asp.net 自定义表单身份验证票证验证,asp.net,security,authentication,forms-authentication,Asp.net,Security,Authentication,Forms Authentication,我有一个网站,里面有很多asp.net应用程序。有些是用MVC2编写的,有些是用MVC3编写的,有些不是在内部编写的,而是二进制部署的(尽管我们可以找到源代码),还有许多是用ASP.NET2.0WebForms编写的。在所有这些站点中,我们使用登录应用程序的单个登录页面。我们可以这样做,因为所有应用程序都共享: 相同的应用程序池 同样的机器钥匙 相同的登录cookie名称 我的问题是他们也有同样的安全问题,没有cookie欺骗保护。 我的计划是向登录cookie(可能在useradata字段中)

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

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

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


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

    您不能覆盖身份验证,除非编写一个新的FormsAuthenticationModule,但有一种更简单的方法。 当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
     }
    

    这是一个有用的链接:

    您不能覆盖身份验证,除非通过编写新的表单来覆盖身份验证模块,但有一种更简单的方法。 当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
     }
    

    这是一个有用的链接:

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