2010-06-18 40 views
18

在部署新版本的ASP.NET 2.0应用程序后,它开始引发安全异常:“System.Security.SecurityException:请求获得类型权限'System.Web.AspNetHostingPermission,System,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'失败。“ASP.NET中的安全异常和IIS 7.5中的加载用户配置文件选项

经过对互联网的快速研究,我们能够通过在IIS 7.5应用程序池中将“加载用户配置文件”设置为True来解决此问题。该解决方案还这里多次提到的计算器:

但是,我们无法找到原因,它必须是真实的。我们检查了新版本中的所有更改(很高兴只有少数),但没有发现任何可疑内容(无法访问注册表或临时数据,因为某些文章建议等)。当IIS 7.5中托管的ASP.NET应用程序需要“加载用户配置文件”选项设置为True时,任何人都可以给我们提示吗?

详细说明:

  • 应用池:.NET 2.0;管理管道模式 - 经典;身份 - 自定义的域帐户
  • 在IIS 6.0(W2K3):新老版本 应用做工精细
  • 在IIS 7.5(W2K8-R2):老版 应用程序的正常工作;新应用程序的 版本会引发安全 例外 - 它启动后 设置“加载用户配置文件”工作为True

谢谢!

编辑: 我们终于找到了这个问题的原因!我们的管理员使用不同的技术将新版本的应用程序从暂存环境复制到生产环境。他使用网络服务器作为中介。在将zip压缩版本构建工件加载到生产环境中然后解压缩文件之后,它们仍被标记为“被阻止”,因为它们来自不同的计算机。另见https://superuser.com/questions/38476/this-file-came-from-another-computer-how-can-i-unblock-all-the-files-in-a然后,ASP.NET以部分信任而不是完全信任的方式逻辑地执行这些二进制文件,实际上在我们的应用程序中引起了所提及的安全异常。

将“加载用户配置文件”设置为True会将安全性异常设置为副作用。如果“加载用户配置文件”设置为False,那么我们的应用程序(不是我们的代码,也许是一些。NET BCL或外部程序集)正在尝试查询有关目录“C:\ Windows \ System32 \ config \ systemprofile \ AppData \ Local \ Microsoft \ Windows \ Temporary Internet Files”的应用程序池标识不允许的基本信息:

  • 完全信任:拒绝访问该查询操作不会引发任何异常
  • 随着部分信任:拒绝访问该查询操作引发安全异常

如果“加载用户配置文件”是设置为True,那么每次应用程序池启动时都会创建Users目录中的临时配置文件。然后,我们的应用程序将尝试查询有关此配置文件的“Temporary Internet Files”目录的信息,该配置文件允许应用程序池的标识。因此,即使部分信任也不会出现异常。

真的很好的故障排除会议! :)

+0

感谢您的调查工作彼得,我有同样的问题和流实用程序(列在superuser.com问题)是我如何解锁我的webapp的目录中的所有文件。现在我可以关闭加载用户配置文件选项! – 2010-08-18 19:32:29

+1

非常出色,我们只是遇到了这个问题,无法正确解释它。 – 2010-11-17 17:24:40

+0

下面的答案有详细的解释http://stackoverflow.com/questions/17149132/what-exactly-happens-when-i-set-loaduserprofile-of-iis-pool – 2016-12-21 07:18:01

回答

7

“加载用户配置文件”设置可以帮助您的另一个示例是使用临时文件。有时这种用法可能是间接的。例如,SQL Express可以在某些情况下执行此操作。

所以我的建议。关闭“加载用户配置文件”并检查%TEMP%。然后尝试为用于应用程序池的域帐户提供对%TEMP%目录的完全访问权限(或更改访问权限)。可能它解决了你的问题。

另一个建议是使用进程监视器(请参阅http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx),以了解当您收到“System.Security.SecurityException:请求类型'System.Web.AspNetHostingPermission“异常的权限。

+1

谢谢你的建议。它帮助我们解决了这个问题。应用程序池标识需要具有对“C:\ Windows \ System32 \ config \ systemprofile \ AppData \ Local \ Microsoft \ Windows \ Temporary Internet Files”目录的读取权限。应用程序只是查询这个目录的基本信息,就是这样。可能它是由我们使用的外部程序集中的一个引起的(我们怀疑iTextSharp)。无论如何,你的建议帮助我们解释了情况,所以再次感谢你。 – Peter 2010-06-21 12:54:16

+0

欢迎彼得! – Oleg 2010-06-21 13:07:48

+0

是否可以在IIS中设置'LoadUserProfile = true'并将默认临时文件夹%TEMP%位置从'C:\ Users \ C:\ Users \ AccountName \ AppData \ Local \ Temp'更改为其他位置? – 2016-07-18 10:17:25

0

LoadUserProfile可能会提供帮助的另一个方面是在WCF中配置可信MSMQ绑定时。如果应用程序池在受信任的帐户下运行,那么将不会加载SID,除非应用程序池加载用户配置文件设置设置为true,因此验证将失败。

1

我也遇到了同样的问题,可以通过设置load user profile = true来解决问题。然而,我已经恢复了负载用户配置文件= false,并重新启动应用程序池,但现在我没有得到任何异常。 我已经经历了所有关于stackoverflow的关注帖子以及Asp.net和iis论坛页面。