为 ASP.NET Core MVC 中的所有响应添加标头

Posted

技术标签:

【中文标题】为 ASP.NET Core MVC 中的所有响应添加标头【英文标题】:Add a header to all responses in ASP.NET Core MVC 【发布时间】:2015-06-12 17:50:32 【问题描述】:

我想知道如何将Access-Control-Allow-Origin:* 添加到我的标题中。

我试过这个没有成功:

app.Use((context, next) =>

    context.Response.Headers.Add("Access-Control-Allow-Origin", new[]  "*" );
    return next.Invoke();
);

【问题讨论】:

【参考方案1】:

使用app.use(...) 并在Startup.Configure 中改变context.Response.Headers 是正确的,但在链中的正确位置执行此操作很重要。 ASP.NET Core 中间件组件可以“短路”(参见ASP.NET Core Middleware 文档),从而阻止调用更多中间件,通过试验我推断UseMvc() 会这样做。那么,在 MVC 应用程序中,这意味着您必须将app.use(...) 调用之前 app.UseMvc()

换句话说,从 Visual Studio 为您生成的模板 ASP.NET Core 2.0 应用程序开始,您希望将 Startup.cs 中的 Startup.Configure 修改为如下所示:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)

    if (env.IsDevelopment())
    
        app.UseDeveloperExceptionPage();
    

    // Add header:
    app.Use((context, next) =>
    
        context.Response.Headers["Access-Control-Allow-Origin"] = "*";
        return next.Invoke();
    );

    app.UseMvc();

【讨论】:

当 app.UseMvc 是最后一个 app.UseCors... 完美运行 由于是这里的示例,值得注意的是,将此特定标头设置为* 具有安全含义,因为它有效地禁用了同源安全策略,这可能导致跨站点请求伪造攻击。仅当您想要打开对整个 Internet 的 ajax 请求访问(例如在公共 API 的上下文中)并确保您公开的所有非幂等请求都具有某种形式的 CSRF 保护时,才使用 *【参考方案2】:

我尝试了您的代码,它运行良好...放置是关键:我很确定它需要位于链的早期。

        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    
        loggerFactory.AddConsole(Configuration.GetSection("Logging"));
        loggerFactory.AddDebug();
        //app.UseCors(builder => builder.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin());
        app.Use((context, next) => 
            context.Response.Headers.Add("Access-Control-Allow-Origin", new[]  "*" );
            return next.Invoke();
        );
        app.UseMvc();
        app.UseWebSockets();
        app.UseSignalR();
    

【讨论】:

【参考方案3】:

您也可以尝试使用 asp.net 核心框架中内置的 CORS Middleware,而不是创建自己的中间件。

Startup类的Configure方法中添加如下代码。

// Add CORS for YourAnotherSite
    app.UseCors(builder =>
       builder.WithOrigins("http://YourAnotherSite.com"));

使用命名策略

Startup 类的Configure 方法中

options.AddPolicy("AllowMyOrigin",
        builder => builder.WithOrigins("http://YourAnotherSite.com"));

然后在启动类的ConfigureServices方法中。

app.UseCors("AllowMyOrigin");

或者,可以将策略应用于每个 ControllerAction 方法。

【讨论】:

嗨,使用app.UseCors 不会在响应中添加标头(或者似乎没有),但它仍然可以实现相同的效果吗? @Percy - 仅为跨域请求添加 Cors 标头。如果您从同一个 Origin 请求,ASP.net 核心不会添加 CORS 标头。【参考方案4】:

我们发现 ApplicationBuilder 方法也不一致 - 不清楚处理程序何时返回链(例如UseStaticFiles()),何时不是(UseMvc())。

你没有说你在什么环境下运行,但如果你打算使用 IIS,那么不要放弃web.config! url rewrite 模块运行良好,允许您对all 请求设置出站规则。

这里有一个很好的答案:https://***.com/a/26545975/548664

【讨论】:

以上是关于为 ASP.NET Core MVC 中的所有响应添加标头的主要内容,如果未能解决你的问题,请参考以下文章

[十] ASP.NET Core MVC 中的路由

如何使用 MVC 的内容协商在 ASP.NET Core MVC 中间件中返回响应?

详解Asp.Net Core 2.1+的视图缓存(响应缓存)

ASP.NET Core MVC 中的慢速显示性能

ASP.NET Core MVC(C#) 文件上传及后台输出响应Aspose.Words处理后文件

如何继续等待 API 请求响应值完成 ASP .Net Core MVC