asp.net核心删除X-Powered-By无法在中间件中完成

时间:2016-08-26 21:31:08

标签: header asp.net-core middleware

为什么我不能删除X-Powered-By作为我正在执行的中间件的一部分?如果我放入web.config,我可以删除它,但如果我把它放在中间件中,我可以删除它。我正在删除中间件“服务器”中的另一个标头:“Kestrel”,它工作并告诉我我的中间件正在执行。

我正在使用Visual Studio 2015,ASP.Net核心Web应用程序(.NET Framework),1.0.0-rc2-final

我的中间件

public class ManageHttpHeadersMiddleware
{
    private RequestDelegate _next;

    public ManageHttpHeadersMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        context.Response.OnStarting(() =>
        {
            context.Response.Headers.Remove("Server");
            context.Response.Headers.Remove("X-Powered-By");

            return Task.CompletedTask;
        });

        await _next(context);
    }
}

My Startup.Configure方法如下所示

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        loggerFactory.AddSerilog(new LoggerConfiguration()
            .ReadFrom.ConfigurationSection(Configuration.GetSection("Serilog"))
            .CreateLogger())
            .AddDebug();

        app.UseMiddleware<ManageHttpHeadersMiddleware>();

        app.UseJwtBearerAuthentication();

        app.UseMvc();

        app.UseSwaggerGen();
        app.UseSwaggerUi();
    }

所以我的问题是:

  1. 是因为我执行中间件的顺序 Startup.Configure?
  2. 是因为我正在执行的事件     中间件?我已经尝试过使用OnCompleted,但显然很晚才删除“Server”:“Kestrel”
  3. 是因为它 由Azure中的Kestrel或IIS添加,唯一的删除方法是通过 web.config?
  4. 我知道你可以说我有一个解决方法,我的问题是什么,但在相同的代码位置实现相同的要求,以帮助维护性等等会很好。

3 个答案:

答案 0 :(得分:12)

关于X-Powered-By的查询。你是必须的,你必须这样做web.config文件。(当你使用IIS时)和任何这样的头任何服务器你必须手动维护或不同,因为这不是ASP.net核心的一部分。

如果您在我们托管时了解ASP.net核心请求管道就像

  1. 浏览器 - IIS - 红隼(Windows)
  2. 浏览 - NGinx - Kestrel(Linux)
  3. 当任何请求进入Kestrel时,它会移交给IIS或Nginx,然后IIS或NGInx可能会添加标头。 X-Powered-By就是这样的标题。因此我们可以将其删除web.config或直接在IIS设置中删除。

    注意:到目前为止,我觉得我们不会在旧的ASP.net / ASP.net MVC中获得任何这样的东西,我们在其中创建HTTPModule并且我们能够删除所有类型的头文件。那是可能的,因为它与IIS紧密集成。

    注意:我已经发表评论,但为了更清楚地说明我无法使用中间件删除服务器标头。即使我尝试了你的代码。 (我试过IIS)。

    要删除Server标头,我必须执行以下操作。

    new WebHostBuilder()
        .UseKestrel(c => c.AddServerHeader = false)
    

答案 1 :(得分:5)

我们可以在web.net中删除X-Powered-By和其他标题,因为它在asp.net核心中再次添加

<httpProtocol>
  <customHeaders>
    <remove name="X-Powered-By" />
  </customHeaders>
</httpProtocol>

答案 2 :(得分:2)

在 dotnet core 3.1 应用程序的应用程序根目录中有一个完整的 web.config,它删除了 X-Powered-ByServer 标头。当您从 Project > Add > New item > Web Config file

添加文件时,其他内容是默认的
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <remove name="aspNetCore" />
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
    </handlers>
    <aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="InProcess" />
    <httpProtocol>
      <!-- Remove X-Powered-By header -->
      <customHeaders>
        <remove name="X-Powered-By" />
        <remove name="Server" />
      </customHeaders>
    </httpProtocol>
    <security>
        <!-- Remove Server header-->
        <requestFiltering removeServerHeader ="true" />
    </security>
  </system.webServer>
</configuration>