IIS7和IIS6配置ASP.NET虚拟主机的账户

内容摘要
ASP.NET 默认情况下并不是用网站的匿名帐户来运行的,而是用一个固定的帐户来运行的,比如 Windows 2000 中是 ASPNET,显然虚拟主机中大家都用同一个
文章正文

  ASP.NET 默认情况下并不是用网站的匿名帐户来运行的,而是用一个固定的帐户来运行的,比如 Windows 2000 中是 ASPNET,显然虚拟主机中大家都用同一个帐户来运行就会造成具有相同的 NTFS 权限,这是很明显的安全隐患。在 Windows 2000 中可以通过模拟来实现不同的虚拟主机使用不同的帐户运行 ASP.NET,具体有些复杂,请参见 正确配置虚拟主机中 ASP.NET 权限。而 Windows 2003(IIS 6)配置又有不同,Windows 2008(IIS 7)中配置又不同。不过 Windows 2008 中是最方便的。

  我们还是从模拟开始,模拟就是在 ASP.NET 配置文件中配置 <identity impersonate="true" />,这样运行 ASP.NET 时就不全是固定的帐户了(Windows 2000 中为 ASPNET、Windows 2003、2008 中为 Network Service),而是运行网站的匿名帐户。为了叙述方便,我们称为半模拟(官方无此名称,仅仅是为了本文叙述方便)。

  模拟也可以指定特定的帐户 <identity impersonate="true" userName="" password="" />,同样为了叙述方便,我们把这种称为全模拟(官方无此名称,仅仅是为了本文叙述方便)。

  我们经过测试,得出几个表,现列出来,为了便于表格不撑大,用了缩写,现将缩写说明如下:

  • AppPool 应用程序池帐户
  • NS 对站点 Network Service 是否需要对站点根目录有 NTFS 权限。
  • Principal System.Security.Principal.WindowsIdentity.GetCurrent().Name 的值
  • NS Network Service
  • demo 运行网站的匿名帐户
  • NS 文件 Network Service 具有读取权限的文件
  • demo 文件 deom 具有读取权限的文件
  • NSdemo 文件 Network Service、demo 均具有读取权限的文件
  • SSPI 普通应用程序用 Windows 身份验证连接 SQL Server 时的帐户。
  • Membership ASP.NET 中的 Membership 用 Windows 身份验证连接 SQL Server 时的帐户。

  另外启用全模拟时:在 Windows 2003 中,将 demo 加入了 IIS_WPG 组;在 Windows 2008 中,将 demo 加入了 IIS_IUSRS 组。不然会无法访问 C:\WINDOWS\Microsoft.NET\Framework 这个文件夹(实际上 2008 中加不加都可以,因为没加的话,运行时会自动动态加入)。

  Windows 2003 中的情况

模拟情况 AppPool NS 对站点 Principle 读 NS 文件 读 demo 文件 读 NSdemo 文件 SSPI Membership
不启用 NS 需要 NS 成功 失败 成功 NS NS
不启用 demo 需要 NS 成功 失败 成功 NS NS
半模拟 NS 需要 demo 失败 失败 成功 demo NS
半模拟 demo 需要 demo 失败 失败 成功 demo NS
全模拟 NS 需要 demo 失败 失败 成功 demo demo
全模拟 demo 需要 demo 失败 失败 成功 demo demo

  可以看出若使用半模拟,有个问题就是 Membership 用 Windows 身份验证去连接 SQL Server 时并不是运行当前网站的帐户,而是统一的 Network Service,这点是个遗憾。使用全模拟可以解决这个遗憾,但帐户方面配置起来又很复杂。

  Windows 2008 中的情况

模拟情况 AppPool NS 对站点 Principle 读 NS 文件 读 demo 文件 读 NSdemo 文件 SSPI Memberhip
不启用 NS 需要 NS 成功 失败 成功 NS NS
不启用 demo 不需要 demo 失败 成功 成功 demo demo
半模拟 NS 需要 demo 失败 成功 成功 demo NS
半模拟 demo 不需要 demo 失败 成功 成功 demo demo
全模拟 NS 需要 demo 失败 成功 成功 demo demo
全模拟 demo 不需要 demo 失败 成功 成功 demo demo

  从表中可以看出,在 Windows 2008 中配置 ASP.NET 虚拟主机权限隔离非常方便,甚至都不需要什么模拟,只需要将应用程序池的帐户设置为网站的匿名帐户就可以了。

代码注释
[!--zhushi--]

作者:喵哥笔记

IDC笔记

学的不仅是技术,更是梦想!