gpt4 book ai didi

asp.net - 为什么 appcmd.exe 解锁配置在 Azure 模拟器上不起作用?

转载 作者:太空宇宙 更新时间:2023-11-03 12:43:30 26 4
gpt4 key购买 nike

我最近升级到了 Azure 2.1 SDK,现在我的 web.config 的一部分遇到了问题。在计算模拟器上运行时处于 Web 角色中。我的web.config包含这个:

<location path="api">
<system.webServer>
<security>
<access sslFlags="Ssl, SslRequireCert, SslNegotiateCert" />
</security>
</system.webServer>
<system.web>
<authorization>
<allow users="*" />
</authorization>
</system.web>
</location>

我需要这个,因为 /api/ 下的所有内容path 要求客户端通过 HTTPS 提供客户端证书来进行身份验证。

默认情况下,IIS 配置为不允许您执行此操作 - <access> system.webServer/security下的元素默认情况下处于锁定状态。所以我总是有一个包含以下内容的启动任务:

SET APPCMD=%windir%\system32\inetsrv\appcmd.exe
IF EXIST APPCMD GOTO :INUSUALPLACE
SET APPCMD="%ProgramFiles%\IIS Express\appcmd.exe"
:INUSUALPLACE
%APPCMD% unlock config /section:system.webServer/security/access

如果没有这个,您将收到 500.19 错误。直到最近,此启动任务始终成功地阻止了该错误,使我的 SSL 配置能够正常工作。

但它不再工作了,据我所知,这是在我切换到 2.1 SDK 时发生的。顺便说一句,此 Web 角色中的其他所有内容都有效 - 仅当我尝试访问 /api/ 下的服务时才有效。我收到错误的 SSL 配置设置所应用的路径。这是500.19。 (500 当然是“内部服务器错误”,但 .19 表示这是一个配置错误。)

据我所知,发生这种情况是因为解锁此配置部分的尝试不再起作用。我这么说的原因是,如果我找到 applicationHost.config Azure 模拟器创建的文件(在 C:\Users\<user>\AppData\Local\dftmp\Resources\<some random guid>\temp\temp\RoleTemp 中),我手动编辑它,替换 Deny对于security具有 Allow 的元素,我不再收到错误,并且可以成功使用需要客户端证书的服务。

这当然没有用作为解决方法 - 这个 applicationHost.config每次在模拟器中运行应用程序时都会重新生成(并且确切位置每次都会更改)。每次在本地调试应用程序时,我都需要某种方法来可靠地自动解锁此配置部分。这就是appcmd.exe应该可以,但它似乎已停止工作。

我确实想到问题可能是它正在获取 appcmd.exe 的 IIS 版本,尽管 Azure SDK 现在使用 IIS Express。我不确定它们是否是不同的程序,所以我尝试在启动命令末尾添加以下内容:

"%ProgramFiles%\IIS Express\appcmd.exe" unlock config /section:system.webServer/security/access

这会显式运行 IIS Express 副本。不过好像没什么区别。

在有人询问之前,启动任务肯定正在运行。在与 applicationHost.config 相同的文件夹中,我看到一个WaHostBootstrapper.log文件,它包含(除其他外)以下几行:

[00025156:00018324, 2013/08/30, 22:15:03.033, INFO ] Executing Startup Task type=0 rolemodule=(null) cmd="c:\dev\mm\DevInt\src\Mm.Cloud\csx\Debug\roles\Mm.Web\approot\bin\Startup\EnableClientCerts.cmd" 
[00025156:00018324, 2013/08/30, 22:15:03.034, INFO ] Executing "c:\dev\mm\DevInt\src\Mm.Cloud\csx\Debug\roles\Mm.Web\approot\bin\Startup\EnableClientCerts.cmd" .
[00025156:00018324, 2013/08/30, 22:15:03.221, INFO ] Program "c:\dev\mm\DevInt\src\Mm.Cloud\csx\Debug\roles\Mm.Web\approot\bin\Startup\EnableClientCerts.cmd" exited with 0. Working Directory = c:\dev\mm\DevInt\src\Mm.Cloud\csx\Debug\roles\Mm.Web\approot\bin

这表明我的EnableClientCerts.cmd (调用 appcmd.exe 的脚本)运行没有错误。

我不太清楚如何 appcmd.exe知道它应该配置哪个特定网站。有几个 - 我在这个盒子上安装了适当的 IIS,并且还配置了一个与 Azure 无关的 IIS Express 站点。是否有可能无法配置正确的目标?

此外,我在 WaHostBootstrapper.log 中看到了一些此类错误。 :

[00025156:00018324, 2013/08/30, 22:15:03.033, ERROR] <- WapGetEnvironmentVariable=0x800700cb

这可能有关联吗?

我的解锁配置部分的脚本中是否缺少某些内容?

最佳答案

事实证明,当模拟器启动启动任务时,它已经设置了APPCMD变量。此外,它设置的不仅仅是引用AppCmd.exe,它还包括一个指向正确配置文件的命令行开关:

“C:\Program Files\IIS Express\appcmd.exe”/apphostconfig:“C:\Users\Ian\AppData\Local\dftmp\Resources\1217ef49-a59a-4e18-8ebc-27d06a78cbd5\temp\temp\RoleTemp\applicationHost.config"

因此,如果启动脚本仅使用 %APPCMD% 而不首先尝试设置它,它将应用于正确的实例。我的脚本无法正常工作,因为它自行决定了 AppCmd.exe 的位置,并且最终会修改 IIS 或 IIS Express 的全局设置,这两者似乎都不会对Azure 模拟器托管的 IIS 实例。 (我猜测这是最近的行为变化,可能与 Azure SDK 2.1 中支持非提升开发的新功能有关。)

令我担心的是,我找不到任何提及此预定义 APPCMD 变量的文档。我只是通过将以下内容添加到我的启动命令脚本中才发现它:

%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe "gci env: | format-list"  > c:\temp\env.log

我临时添加了该内容并运行了 Web 角色,它提供了所有环境变量的完整转储。查看该列表,APPCMD 变量是唯一包含目标正确配置所需信息的变量。但启动任务的文档似乎建议直接指向 AppCmd.exe 的 IIS 副本 - Use AppCmd.exe to Configure IIS at Startup文章只是硬编码了路径。我想如果我在模拟器中启用完整的 IIS,就会起作用,但我真的不想这样做。

因此,虽然这个解决方案有效(并且考虑到启动任务环境中的情况,似乎是唯一可行的解​​决方案),但它让我感到紧张,因为它是一个未记录的功能。因此,如果您偶然发现这个答案,请务必小心 - 它可能不可靠。

关于asp.net - 为什么 appcmd.exe 解锁配置在 Azure 模拟器上不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18541845/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com