【问题标题】:Add a header to all responses in ASP.NET Core MVC为 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();
});

【问题讨论】:

    标签: c# asp.net-core .net-core asp.net-core-mvc


    【解决方案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.configurl rewrite 模块运行良好,允许您对all 请求设置出站规则。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-11
        • 2018-08-15
        • 1970-01-01
        • 2019-02-06
        • 1970-01-01
        相关资源
        最近更新 更多