为 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");
或者,可以将策略应用于每个 Controller 或 Action 方法。
【讨论】:
嗨,使用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 中的所有响应添加标头的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 MVC 的内容协商在 ASP.NET Core MVC 中间件中返回响应?
详解Asp.Net Core 2.1+的视图缓存(响应缓存)