原文地址:http://www.iis.net/1026/SinglePageArticle.ashx
翻译:Tony Qu (来自BluePrint翻译团队)
作者:Vikas Malhotra
最后更新时间:2006年9月12日,星期二,上午11:48
介绍
在以前的IIS版本中有一个本地帐号,是在安装时创建的,叫做IUSR_MachineName。一旦启用匿名身份认证,这个IUSR_MachineName帐号就是IIS默认使用的身份(identity),它同时在FTP和HTTP服务中使用。另外还有一个叫做IIS_WPG的组,它是所有应用程序池帐号的容器。在IIS安装期间,必须保证所有的系统可用资源已经为IIS_WPG设置了适当的权限,当管理员创建一个新的应用程序池帐号时,只需要把新帐号(身份)加入这个组即可。
这个模型运转得很好,但是和其他任何设计一样,它们有他们的缺点,主要的缺点是IUSR_MachineName帐号和IIS_WPG组对于创建它们的系统来说都是本地的。 Windows中的每个帐号或组都有一个唯一的号码叫做SID(安全识别号),这样就可以区别于其它的帐号或组。我们仅使用SID来创建创建ACL。作为以前版本的IIS设计的组成部分,我们将IUSR_MachineName包含在了metabase.xml文件中,如果你尝试从一台机器拷贝metabase.xml到另一台机器上,它并不会马上运转起来,因为另一台机器上的帐号使用的名字是不同的。另外,你不能仅用xcopy /o来拷贝ACL,因为不同机器上的SID也是不同的。一个解决方法是使用域帐号,但是你需要在你的架构中添加一个活动目录。IIS_WPG组也有同样的权限问题,如果你在一个机器的文件系统上为IIS_WPG组设置ACL,使用xcopy /o来拷贝ACL到另一台机器上是无法成功的。IIS了解了这一问题,并通过在IIS7.0中使用内建的帐号和组对其作了改进。
内建的帐号和组是由操作系统保证的,这样就可以保证有一个唯一的SID,IIS甚至做得更好,它保证了新的帐号名称和组名称永远不会被本地化。例如,无论你安装的是那种语言版本的Windows,IIS帐号名称将永远是IUSR,而组名称将永远是IIS_IUSRS。
总的来说,在IIS 7.0中:
IUSR内建帐号替代了IUSR_MachineName帐号
IIS_IUSRS内建组替代了IIS_WPG组
因为IUSR是一个内建帐号,它不再需要密码。逻辑上你可以认为它就是NETWORKSERVICE或LOCALSERVICE帐号。IUSR帐号和IIS_IUSRS组将在下面的章节中做进一步介绍。
理解新的IUSR帐号
正如上面所说的,在IIS 7.0中IUSR帐号将替代IUSR_MachineName 帐号。仅在安装FTP服务器时,IUSR_MachineName 帐号才会被创建和使用。如果不安装FTP,那么这个帐号将永远不会被创建。
这个内建帐号并不需要密码,当启用匿名身份认证时,该帐号并将被作为默认的用户身份使用。如果你看一看applicationHost.config文件,你会发现下面的定义:
<anonymousAuthentication enabled="true" userName="IUSR" defaultLogonDomain="" />
这就告诉了IIS对所有的匿名身份认证请求使用新的内建帐号。这样做的最大优点在于,我们现在可以:
* 使用Windows Explorer或许多其他命令行工具为IUSR设置文件系统权限
* 不用再担心这个帐号的密码会过期
* 使用xcopy /o无缝拷贝文件以及它们的所有权和ACL信息到不同的机器上
有一点要重点提一下:IUSR帐号和LOCALSERVICE帐号在方式上很相似,它是在网络上匿名工作。NETWORKSERVICE和LOCALSYSTEM 可以以机器身份工作,但IUSR则不是,因为它是一种特权的升迁。如果你希望有一个拥有网络访问权限的匿名帐号,你就需要创建一个新的用户帐号,并手工设置用户名和密码,就像你以前设置匿名身份验证一样。要在IIS Manager中实现这一点,你可以:
* 点击Start按钮,键入"INetMgr.exe"并按回车(如果弹出提示框,请按Continue来提升权限)
* 点击Connection中机器名称旁边的"+"按钮
* 在IIS Manager中双击你要管理的站点
* 双击Feature Name标题下面的Authentication项
* 选择Anonymous Authentication,点击右侧Task标题下面的Edit,弹出Specify Credentials dialog(指定认证对话框)
* 点击Specific User选项,然后按下"Set"按钮
* 输入想设的用户名和密码,按OK
理解新的IIS_IUSRS组
正如前面所提到的,IIS_IUSRS组是用来替代IIS_WPG组的,它已经拥有了所有的文件和系统资源的访问权限,因此如果一个帐号被添加到该组中,它将以应用程序池身份无缝工作。
由于与内建帐号配合工作,该内建组可以解决几个xcopy的部署问题。如果你在文件上为IIS_WPG设置权限(在IIS6中这是可以的),并尝试把这些文件拷贝另外一个Windows系统中,由于组SID在不同机器上是不同的,站点设置可能被破坏。
在IIS7中,由于组SID在所有Longhorn系统中是相同的。当你从一台机器向令一台机器移动文件时,使用'xcopy /o'可以保留ACL和拥有权信息,这使得xcopy部署变得简单的多!
客户们的第二个请求是“一旦我们配置了应用程序池身份,我们需要IIS来帮我们做所有必要的修改”。我们接受了这个意见,并使这一过程在IIS7.0中变得更加简单。当IIS启动一个工作者进程(worker process)时,需要创建一个供该进程使用的令牌(token)。现在,当我们创建这个令牌时,IIS将自动在运行时添加IIS_IUSRS membership到工作者进程令牌中,这么做能够让账号以应用程序池身份运行,而不需要显示地作为IIS_IUSRS组的一部分。我们相信这一修改将帮助你更轻易地设置系统,并让您的整体体验更好。
如果你想禁用这个特性并手工添加账号到IIS_IUSRS组,你可以通过设置manualGroupMembership值为true来仅用这一特性。下面是关于如何设置defaultAppPool来禁用这一特性的例子:
<applicationPools>
<add name="DefaultAppPool">
<processModel manualGroupMembership="true" />
</add>
</applicationPools>