为什么我不应该在IIS中将我的asp.net网站或webapp部署到域的根目录?

为什么我不应该在IIS中将我的asp.net网站或webapp部署到域的根目录?,asp.net,web-applications,web,iis-7.5,web-deployment,Asp.net,Web Applications,Web,Iis 7.5,Web Deployment,几年前,我记得我在一个域的情况下挣扎于多个站点,其中一个站点放在根目录中 当时我阅读了一篇权威文章,清楚地向我解释了为什么这是一个坏主意,我记得级联web.config问题是主要原因(迫使您取消声明子项目中与该项目本质上不相关的冲突引用)。从今以后,我总是在自己的虚拟路径中部署任何网站,使用根目录中的单个重定向指向默认网站 我似乎再也找不到权威参考了,从那时起,部署考虑因素可能已经发生了变化 这种情况的优点和更可能的缺点是什么?我问这个问题是因为我的一家公司不赞成用这种方式分离部署,我认为这不是

几年前,我记得我在一个域的情况下挣扎于多个站点,其中一个站点放在根目录中

当时我阅读了一篇权威文章,清楚地向我解释了为什么这是一个坏主意,我记得级联web.config问题是主要原因(迫使您取消声明子项目中与该项目本质上不相关的冲突引用)。从今以后,我总是在自己的虚拟路径中部署任何网站,使用根目录中的单个重定向指向默认网站

我似乎再也找不到权威参考了,从那时起,部署考虑因素可能已经发生了变化


这种情况的优点和更可能的缺点是什么?我问这个问题是因为我的一家公司不赞成用这种方式分离部署,我认为这不是一个好主意。

我能想到的在一个域下托管多个“站点”(比如IIS中的一个“站点”)的主要反指是用户身份隔离;当您配置例如Windows身份验证时,登录到/site1的访问者也将登录到/site2,而这可能是您不想要的

这可能适用于域级别设置的cookie。在IIS中,网站是一个安全边界(对于客户端也是如此),在同一个域中有多个“站点”可能会使您面临安全漏洞


至于在根目录中放置一个“站点”,在子文件夹中放置其他站点;为“根站点”设置的应用程序设置将级联到“子文件夹站点”;同样,这可能不是问题,但它是一个潜在的安全缺陷。

简短回答:隔离。在IMO中,托管不同的web站点/web应用程序而不隔离它们的好处是毫无意义的

长答覆:

优点:

  • 使用没有特定绑定(即别名)的单个端口:如果 无法访问网站绑定,这很有用
  • 快速部署和动态网站创建:您可以创建新的 子网站而不在IIS端声明它
  • 共享设置:将网站基础设置应用于所有子网站 (文档、mime类型等)
缺点:

  • 应用程序池隔离:没有身份隔离,没有工作进程 隔离、无故障/恢复隔离等。。。(超时、内存限制等)

  • AppDomain或终身隔离:您必须保护您的网站AppDomains。如果您共享相同的AppDomain,那么您将共享相同的生命周期:如果 AppDomain卸载后,此AppDomain下的所有网站都将关闭并重新加载(即,如果您触摸AppDomain web.config)

  • 架构隔离:一些web应用程序开发需要一些 在IIS端进行tunning,如果您只需调整IIS池或网站 对于一个应用程序,它对所有网站都有影响。例如,我考虑32位和64位设置或通配符映射

  • 代码和安全隔离:在同一工作进程和/或AppDomain中运行的应用程序对跨应用程序访问/黑客/攻击的保护较少。你必须更加警惕,以确保应用程序中的信息不会被其他应用程序读取

  • 审核:审核网站活动和失败可能会更加困难

Web应用程序隔离一直是相互化环境中的一个目标,以保护应用程序彼此不受影响

自IIS 7以来,应用程序池隔离通过“应用程序池标识”更进一步:

我也发现了这篇文章:


您还应该了解SharePoint网站集体系结构。想法如下:。

感谢您指出安全问题。我没有想到路径或域cookie(虽然很明显)。身份验证是按路径隔离并级联到子目录,还是仅按域隔离?我们使用一个自定义的身份验证处理程序,因此在当前场景中这可能无关紧要。身份验证(basic+windows)通常是站点范围的,但授权可以以级联方式配置。表单身份验证是cookie驱动的,建议可以进行身份验证,以便不同的子文件夹同时允许不同的登录用户。您的自定义处理程序在哪里存储访问者身份?如果这是cookie驱动的,您应该确保将cookie设置为仅对单个子网站有效…感谢您的广泛写入。在S.Goodyear的链接中,他总结道:“记住,虚拟结构和网站分类法(目录)可以是任何东西,因为它们只是指向内容的超链接。避免在链接可以的时候做出物理结构决定!”,我认为这是一个很好的例子。