【问题标题】:web.config settings not respected in .net core 3.1 Azure multi-instance scaled app service?.net core 3.1 Azure 多实例扩展应用服务中不尊重 web.config 设置?
【发布时间】:2021-03-27 08:51:14
【问题描述】:

我正在尝试从发布到 Azure 的“纯”Web api 应用程序(即无 MVC)返回的响应中添加/删除某些 http 标头。

我在VS2019的项目中添加了如下web.config:

<configuration>
  <system.webServer>
    <httpProtocol>
      <customHeaders>
        <add name="X-Content-Type-Options" value="nosniff"/>
        <add name="X-Frame-Options" value="SAMEORIGIN"/>
        <remove name="X-Powered-By"/>
      </customHeaders>
    </httpProtocol>
  </system.webServer>
</configuration>

这在我使用 IISExpress 的开发环境中运行良好。当应用程序发布到 Azure 以用于未配置为多实例缩放的应用程序服务时,它也可以正常工作。但是,当应用服务配置为多实例扩展(在我的例子中是三个实例)时,来自应用的响应包含“X-Powered-By”并且没有“X-Content-Type-Options” ' 或 'X-Frame-Options'。

发布在我的开发机器上的 Out 文件夹中创建以下 web.config:

<configuration>
  <system.webServer>
    <httpProtocol>
      <customHeaders>
        <add name="X-Content-Type-Options" value="nosniff" />
        <add name="X-Frame-Options" value="SAMEORIGIN" />
        <remove name="X-Powered-By" />
      </customHeaders>
    </httpProtocol>
    <handlers>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
    </handlers>
    <aspNetCore processPath=".\<apname>.exe" stdoutLogEnabled="false" stdoutLogFile="\\?\%home%\LogFiles\stdout" hostingModel="inprocess" />
  </system.webServer>
</configuration>

我还验证了上面的 web.config 存在于 Azure 中应用服务的根目录中。

在 Azure 中的应用服务配置中是否还需要完成其他任何操作才能使用多实例扩展?

【问题讨论】:

  • 你在 webapp 中使用哪个平台?
  • 如果我的回复有帮助,请采纳为答案(点击回复旁边的标记选项将其从灰色切换为填写。),请参阅meta.stackexchange.com/questions/5234/…
  • 我使用的是Windows平台

标签: azure-web-app-service asp.net-core-webapi asp.net-core-3.1


【解决方案1】:

测试后,您无需进行任何更改。在代码或 web.config 中,您的解决方案当前是可行的,前提是它部署在基于 Windows 的 webapp 中。如果是在linux下部署的,那么web.config文件是无​​效的。 web.config 文件仅适用于iis。在linux下,需要用到的配置文件应该是.htaccess

把web.config放到wwwroot路径下,也就是项目的根目录。

基于windows azure webapp,部署后效果应该和本地iis效果一致。经过测试,我部署后,你可以看到截图,你的web.config中的效果已经实现了。

注意:

有些标题不能删除,但可以覆盖。它们需要在程序中编码。你还没有参与这个问题。

<httpProtocol>
  <customHeaders>
    <add name="X-Content-Type-Options" value="nosniff" />
    <add name="X-Frame-Options" value="SAMEORIGIN" />
    <-- replace server vaule -->
    <add name="Server" value="N/A" />
    <remove name="X-Powered-By" />
  </customHeaders>
</httpProtocol>

测试步骤:

使用 web.config 的方法 1

  1. 创建如下示例项目。

  2. 部署到 azure,请在 scm 网站上查看我的文件。

没有 web.config 的方法 2(解决方法,也适用于 linux)

Startup.cs 中添加以下代码,它也适用于我。

app.Use(async (context, next) =>
{
    context.Response.Headers.Add("X-Content-Type-Options", "nosniff");
    context.Response.Headers.Add("X-Frame-Options", "SAMEORIGIN");
    context.Response.Headers.Remove("X-Powered-By");
    await next.Invoke();
});

【讨论】:

  • start.cs 中的 app.Use() 现在对我有用。这很棒,因为我试图避免将更多包(例如 NWebsec)带入项目。但是,我无法使其与 web.config 一起使用。 Azure 应用服务的多实例缩放可能存在问题。在不扩展 web.config 的情况下部署到应用服务时工作正常。我会相应地更新我原来的帖子。
猜你喜欢
  • 2014-09-28
  • 2020-08-29
  • 2020-02-24
  • 1970-01-01
  • 2022-11-22
  • 1970-01-01
  • 2018-08-21
  • 2018-10-20
  • 2021-08-10
相关资源
最近更新 更多