【问题标题】:Security exceptions in ASP.NET and Load User Profile option in IIS 7.5ASP.NET 中的安全异常和 IIS 7.5 中的加载用户配置文件选项
【发布时间】:2011-03-05 08:33:23
【问题描述】:

在部署我们的 ASP.NET 2.0 应用程序的新版本后,它开始引发安全异常:„System.Security.SecurityException: Request for the permission of type 'System.Web.AspNetHostingPermission, System, Version=2.0.0.0 , Culture=neutral, PublicKeyToken=b77a5c561934e089' 失败。”。

在 Internet 上进行快速研究后,我们能够通过在 IIS 7.5 应用程序池中将“加载用户配置文件”设置为 True 来解决此问题。这个解决方案在stackoverflow上也多次提到:

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

详情:

  • 应用程序池:.NET 2.0;托管管道模式 - 经典;身份 - 自定义域帐户
  • 在 IIS 6.0 (W2K3) 中:新旧版本 应用程序版本工作正常
  • 在 IIS 7.5 (W2K8-R2) 中:旧版本的 应用程序工作正常;新版本 应用程序提高安全性 例外——它在之后开始工作 将“加载用户配置文件”设置为 True

谢谢!

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

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

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

如果“加载用户配置文件”设置为 True,则每次应用程序池启动时都会在用户目录中创建临时配置文件。然后,我们的应用程序尝试查询有关此配置文件的“临时 Internet 文件”目录的信息,允许应用程序池的身份。因此,即使部分信任也不会引发异常。

非常好的故障排除会议! :)

【问题讨论】:

  • 感谢 Peter 的调查工作,我遇到了同样的问题,streams 实用程序(在 superuser.com 问题中列出)是我如何解锁我的 webapp 目录中的所有文件。现在我可以关闭加载用户配置文件选项!
  • 太棒了,我们刚刚遇到这个问题,无法正确解释。
  • 下面的答案有详细解释stackoverflow.com/questions/17149132/…

标签: asp.net security exception iis-7


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      另一个建议是使用进程监视器(请参阅http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx)来设置在您收到“System.Security.SecurityException:请求”时将使用用户配置文件的哪些部分(或收到“拒绝访问”错误)对于“System.Web.AspNetHostingPermission”类型的权限异常。

      【讨论】:

      • 感谢您的建议。它帮助我们解决了问题。应用程序池标识需要对“C:\Windows\System32\config\systemprofile\AppData\Local\Microsoft\Windows\Temporary Internet Files”目录的读取权限。该应用程序只查询该目录的基本信息,仅此而已。可能是由我们使用的外部程序集之一引起的(我们怀疑是 iTextSharp)。无论如何,您的建议帮助我们解释了情况,再次感谢您。
      • 是否可以在 IIS 中设置 LoadUserProfile=true 并将默认临时文件夹 %TEMP% 位置从 C:\Users\C:\Users\AccountName\AppData\Local\Temp 更改为其他位置?
      • @MuraliMurugesan:我认为是的。如果您在应用程序池的“加载用户配置文件”设置中有“真”(请参阅​​“高级设置”),那么 IIS 只会加载相应用户帐户的用户配置文件。您可以在服务器上以用户身份交互登录,并将用户的环境变量 TEMP 的值更改为任何其他值,作为默认的%USERPROFILE%\AppData\Local\Temp。它应该可以工作。
      • 谢谢奥列格。我可以知道值%USERPROFILE%\AppData\Local\Temp 存储在IIS 中的什么位置吗?或者它在注册表中的某个地方?我已经将 LoadUserProfile 设置为 true,但想更改我的临时文件夹位置
      • @MuraliMurugesan:值%USERPROFILE%\AppData\Local\Temp存储在 IIS 中。它将存储在用户帐户的注册表 (HKEY_CURRENT_USER\Environment) 中。它存在于您用于应用程序池的用户的用户配置文件中。修改注册表值的最简单方法是以用户身份交互加载并在用户上下文中更改 TEMP(或在以用户身份登录后更改注册表)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-29
      • 1970-01-01
      • 2020-06-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-01
      相关资源
      最近更新 更多