0

我正在寻找有关使用 IIS6、ASP.NET 网站(SiteA、FW 2.0)和具有静态内容的网站(SiteB)的访问限制的解决方案:

问题/前提条件:

  • 通过SiteA身份验证的用户应该能够访问SiteB的静态内容
  • 对SiteB的未经身份验证的访问应重定向到SiteA的登录脚本
  • 因为SiteA是遗留代码,它不使用任何 ASP.NET 的身份验证机制。有一种方法IsAuthenticated() = true/false可以检查SiteA的身份验证状态。
  • 我仍然可以将SiteB放在任何地方(取决于解决方案):在SiteA的目录结构或其他地方,可能在另一台服务器上

考虑的解决方案/它如何工作:

  • SiteB放在SiteA目录结构中(例如SiteA-Root/subfolder/SiteB-Root
  • IIS 应拦截对目录的请求SiteA-Root/subfolder/SiteB-Root
  • IsAuthenticated == true如果对于每个请求,IIS 允许访问SiteA-Root/subfolder/SiteB-Root
  • IIS 重定向到SiteA的登录页面,否则

我已经尝试过的:

  • 使用 IIS-UrlRewrite 并将对SiteB的任何请求重定向到保护脚本,例如SiteA/Interceptor.aspx?referer=<Url of requested content of SiteB>
  • Interceptor.aspx<Url of requested content of SiteB>如果加载IsAuthenticated() == true或重定向到登录页面,否则
  • Interceptor.aspx将加载的流写入它自己的响应
  • 问题:
    • 加载的SiteB页面中的任何相对链接都不再起作用 -> 需要解析(?)
    • 繁重的处理,因为对SiteB的任何请求都由Interceptor.aspx

任何建议,将不胜感激。谢谢。

4

1 回答 1

0

IIS 6.0(或 IIS7.0 之前的任何版本)的问题在于,它不支持通过 ASP.NET 生命周期对静态内容的请求。因此,您无法访问 Global.asax 和其他 ASP.NET 功能(如身份验证/授权)中定义的事件。

但我想有一种方法可以覆盖这种行为,如本文所述:http: //www.devtoolshed.com/globalasax-events-iis-6-and-iis-7-static-resources

因此,一旦您将其配置为通过 ASP.NET 生命周期传递请求,就不可能在这些适当的 Global.asax 事件之一中捕获请求,然后设置该请求已通过身份验证的 Session 值或不是?您也可以使用正确的表单身份验证。

因此,如果对静态内容的请求(它是 SiteA 本身的子文件夹的一部分),您必须检查(在 Global.asax 中的一个事件中)该请求是否已通过会话身份验证,如果不重定向到登录表单。由于您正在进行传递,以防它已经通过身份验证,因此您也不应该有断开的链接。

于 2013-09-24T08:53:51.970 回答