IIS7 与 IIS 6 相比有了很大的改动,原来在 IIS 6 下可以的设置到了 IIS 7 下有的会发生变化。身份模拟的配置上,IIS7 和 IIS6有很大不同,网上IIS6的身份模拟的文章比较多,但介绍IIS7的比较少,我把的一些折腾的经验在这篇博客中写下来,以供参考。
IIS 7 有两种 ASP.NET Application Mode。
一种是 集成模式(Integrated Mode) 这个是默认的模式,也是微软推荐的模式,另一种是 经典模式(Classic Mode) ,这种模式是用于兼容老版本。集成模式使用更方便而且安全性更好,不需要把模拟帐户的用户名和密码写在配置文件中,这样更安全也更方便。既然我们已经用了IIS 7,那么我们还是按微软推荐的方式使用集成模式比较好。
集成模式下,身份模拟可以完全通过界面来完成:
首先如上图所示,IIS 7 在 Server Level 下有个 IIS-> Authentication ,双击这个图标我们看到下面这个图:
在这个图中我们看到 IIS7 多了一个 ASP.NET Impersonation 的功能,在 Actions 里面点 Enable 开启身份模拟功能,然后点 Edit 编辑身份模拟。
我们看到上面这个编辑框,在这个编辑框中,我们指定要进行身份模拟的帐号,这个帐号必须是本地已经存在的帐号,点 Set 输入这个帐号的名称和密码。
然后点OK。
到这里,按照 MSDN 中的帮助文档,身份模拟应该就算设置成功了。
然后我做了一个简单的测试页面看看身份模拟是否成功,测试程序如下:
protected void Page_Load(object sender, EventArgs e)
{
Response.Write(System.Security.Principal.WindowsIdentity.GetCurrent().Name);
}
运行的结果居然是:
NT AUTHORITY\IUSR
也就是说 Asp.net 没有用我设置的这个 MyAccount 帐号模拟运行,而是仍然用IUSR 帐号模拟运行。查了好久,才发现是下面问题造成:
用 Virtual Studio 2008 生成网站时,web.config 文件中默认会有这样一个设置:
<identity impersonate="true" /> 这个设置是为 IIS 6 做身份模拟而设置的。在这种情况下,用户身份的认证交给IIS来进行。当允许匿名登录时,IIS将一个匿名登录使用的标识(缺省情况下是IUSR)交给ASP.NET应用程序。当不允许匿名登录时,IIS将认证过的身份标识传递给ASP.NET应用程序。ASP.NET的具体访问权限由该账号的权限决定。这个设置在 IIS 7 下已经过时了,如果用古典模式,才需要这样设置。
找到问题原因后,我把 <identity impersonate="true" /> 这个配置项从 web.config 中删除了。删除后,就可以用到前面在界面上配置的用户名来模拟帐号了。
然而先不要高兴的太早,紧接着就出现了新的问题。 错误如下:
Could not load file or assembly 'xxxx' or one of its dependencies. Access is denied.Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.Exception Details: System.IO.FileLoadException: Could not load file or assembly 'GetPathFileLib' or one of its dependencies. Access is denied.
Source Error:
从错误提示看,应该是目前这个模拟帐户没有足够的权限去执行 bin 目录下的 xxxx.dll ,于是我把bin 目录赋予模拟帐户 MyAccount 完全控制的权限,结果还是不行,我在网上搜了一下,有人说需要将C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary 这个目录也设置为完全控制,于是照做了,还是不行。无奈之下,我把MyAccount 帐户加入了 IIS_IUSRS这个群组,问题终于解决。
现在我们再运行上面那个显示当前用户的代码显示结果为
MachineName\MyAccout
注意:我们必须要把 <identity impersonate="true" /> 删除才行,如果仅仅是设置为 <identity impersonate="false" />模拟的帐户会变成 IIS APPPOOL\DefaultAppPool,这个设置是不正确的。
到这里IIS7 下设置身份模拟就全部完成了。