IIS7和IIS6配置ASP.NET虚拟主机的账户
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="" />,同样为了叙述方便,我们把这种称为全模拟(官方无此名称,仅仅是为了本文叙述方便)。
我们经过测试,得出几个表,现列出来,为了便于表格不撑大,用了缩写,现将缩写说明如下:
另外启用全模拟时:在 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 虚拟主机权限隔离非常方便,甚至都不需要什么模拟,只需要将应用程序池的帐户设置为网站的匿名帐户就可以了。