MVC6 Cors - 拦截预检

Posted

技术标签:

【中文标题】MVC6 Cors - 拦截预检【英文标题】:MVC6 Cors - intercept preflight 【发布时间】:2015-11-05 17:15:27 【问题描述】:

我正在将我的 WebApi(s) 升级到 MVC6。

在 WebApi 中,我可以拦截每个 HTTP 请求,如果是预检,我可以使用浏览器接受的标头进行响应。

我试图弄清楚如何在 MVC6 WebApi 中做同样的事情。

这是 WebApi 代码。

    protected void Application_BeginRequest(object sender, EventArgs e)
    
        if (Context.Request.Path.Contains("api/") && Context.Request.HttpMethod == "OPTIONS")
        
            Context.Response.AddHeader("Access-Control-Allow-Origin", Context.Request.Headers["Origin"]);
            Context.Response.AddHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
            Context.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
            Context.Response.AddHeader("Access-Control-Allow-Credentials", "true");
            Context.Response.End();
        
     

如何使用 MVC6 做同样的事情?

谢谢, 鲍勃

这是我根据反馈进行的下一次尝试。如果我了解中间件管道,我可能会自己解决这个问题。我现在当然会学习它。

我尝试了这段代码,但它没有像我希望的那样命中 http 请求。

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    
        // Configure the HTTP request pipeline.
        app.UseStaticFiles();

        // Add MVC to the request pipeline.
        app.UseMvc();
        // Add the following route for porting Web API 2 controllers.
        // routes.MapWebApiRoute("DefaultApi", "api/controller/id?");

        // custom middleware to checked each call as it comes in.
        app.Use(async (httpContext, next) =>
        
            if (httpContext.Request.Path.Value.Contains("api/") && httpContext.Request.Method == "OPTIONS")
            
                httpContext.Response.Headers.Add("Access-Control-Allow-Origin", new[]  httpContext.Request.Headers["Origin"] );
                httpContext.Response.Headers.Add("Access-Control-Allow-Headers", new[]  "Origin, X-Requested-With, Content-Type, Accept" );
                httpContext.Response.Headers.Add("Access-Control-Allow-Methods", new[]  "GET, POST, PUT, DELETE, OPTIONS" );
                httpContext.Response.Headers.Add("Access-Control-Allow-Credentials", new[]  "true" );
                return;
            
            await next();
        );

    

【问题讨论】:

与***.com/questions/31976337/…重复 【参考方案1】:

您可以为此添加自己的middleware。这是一个内联添加它的快速示例,但您也可以封装在一个类中:

app.Use(async (httpContext, next) =>

    if (httpContext.Request.Path.Value.Contains("api/") && httpContext.Request.Method == "OPTIONS")
    
        httpContext.Response.Headers.Add("Access-Control-Allow-Origin", new[]  httpContext.Request.Headers["Origin"] );
        httpContext.Response.Headers.Add("Access-Control-Allow-Headers", new[]  "Origin, X-Requested-With, Content-Type, Accept" );
        httpContext.Response.Headers.Add("Access-Control-Allow-Methods", new[]  "GET, POST, PUT, DELETE, OPTIONS" );
        httpContext.Response.Headers.Add("Access-Control-Allow-Credentials", new[]  "true" );
        return;
    
    await next();
);

您可能还想关注ongoing work 以支持 ASP 5 框架内的 cors

【讨论】:

谢谢丹尼尔。我今天会试试这个。并感谢额外的“正在进行的工作”资源。我会留意的。 那行得通。现在 IIS 正在劫持 Options 预检。在 Web Api 中,通过 WebConfig 更改很容易克服。现在我们没有 WebConfig... 还是我们?嗯。我会回来的。 wwwroot 文件夹中仍然有一个 web.config,我希望该文件中的 IIS 设置能够继续工作(类似于this deployment),但我自己只尝试过 IIS express。 4 年零 8 个月后,我找到了这个回复,它帮了我很大的忙。在包含 MVC 和 Web Api 控制器(后者通过令牌进行身份验证)的同一站点中组合 OpenId 和 JWT 令牌身份验证时,拦截 Preflight 是我可以绕过浏览器 CORS 检查的唯一方法。谢谢!

以上是关于MVC6 Cors - 拦截预检的主要内容,如果未能解决你的问题,请参考以下文章

CORS:为啥我的浏览器不发送 OPTIONS 预检请求?

由于 CORS 选项预检,ReactJS 无法发送 POST 请求

从服务工作者发送的 CORS 预检请求,但不是来自常规请求

Angular HTTP 拦截器自定义预检

角度拦截器和 CORS

springmvc拦截器使CORS anaotion和拦截器无法处理跨域