【问题标题】:ASP.NET 5: Access-Control-Allow-Origin in responseASP.NET 5:响应中的访问控制允许来源
【发布时间】:2016-03-08 01:01:47
【问题描述】:

据我了解,当相应启用 CORS 时,响应模型应包含以下标头信息(前提是我要允许所有内容):

Access-Control-Allow-Origin: *
Access-Control-Allow-Method: *
Access-Control-Allow-Header: *

Startup启用它:

public void ConfigureServices(IServiceCollection services)
{
    //...
    services.AddCors();
    services.ConfigureCors(options => 
    {
        options.AddPolicy("AllowAll", p => p.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader().AllowCredentials());
    });
    //...
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    //...
    app.UseCors("AllowAll");
    //...
}

问题是这些标头都没有返回,我在尝试从 API 请求时收到以下错误:

对预检请求的响应未通过访问控制检查:否 请求中存在“Access-Control-Allow-Origin”标头 资源。 Origin 'http://localhost' 因此不允许访问。

【问题讨论】:

  • chrome 控制台是否出现此错误?
  • 你在MVC中间件之前注册了Cors中间件吗?你能分享更多关于你的Configure方法的信息吗?
  • 正如 Kiran 所说,如果您在 app.UseMvc 之后在 Startup.Configure 方法中添加了 app.UseCors,这将不起作用。您需要在 MVC 中间件之前添加 Cors 中间件。 (顺便说一句,在RC1中已经没有ConfigureCors方法了,选项可以直接传递给AddCors方法)
  • @DanielJ.G.,正确的顺序(app.UseCorsapp.UseMvc 之前)对我有用。请将此添加为答案,以便我投票赞成:)谢谢!这很烦人,因为latest docs 中没有提到它。
  • 我没有app.UseMvc() 只有:app.UseHttpsRedirection(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); });

标签: c# cors asp.net-core azure-web-app-service asp.net-core-mvc


【解决方案1】:

确保在Startup.Configure 方法中在app.UseMvc 之前添加app.UseCors,因为您需要在MVC 中间件之前应用CORS 中间件。

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    ...

    //Add CORS middleware before MVC
    app.UseCors("AllowAll");

    app.UseMvc(...);
}

否则请求将在应用 CORS 中间件之前完成。这是因为UseMvc 调用UseRouter 最终添加了RouterMiddleware,并且此中间件仅在未找到请求的路由处理程序时执行下一个配置的中间件。

【讨论】:

  • 哇,这有帮助。我们的Configure(IApplicationBuilder app) 被抽象为一个基类。所以我们在调用基类后调用app.UseCors
【解决方案2】:

在 .Net Core Web API 5.0 中的 Configure 方法中,您必须在其他方法之前添加 app.UseCors,如下所示:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        ...
    }

    //add CORS
    app.UseCors();

    app.UseHttpsRedirection();

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}

【讨论】:

    猜你喜欢
    • 2016-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-16
    • 2017-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多