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 下设置身份模拟就全部完成了。