web-dev-qa-db-ja.com

ASP.NET 5:応答でのAccess-Control-Allow-Origin

私の理解では、それに応じて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」ヘッダーがありません。したがって、オリジン ' http:// localhost 'はアクセスを許可されていません。

13
Dave New

app.UseCorsメソッドのapp.UseMvcの前にStartup.Configureを追加してください。これは、MVCミドルウェアの前にCORSミドルウェアを適用する必要があるためです。

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

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

    app.UseMvc(...);
}

それ以外の場合、リクエストはCORSミドルウェアが適用される前に終了します。これは、 UseMvcUseRouter を呼び出し、最終的に RouterMiddleware を追加するためです。このミドルウェアは、要求のルートハンドラーが見つからなかった場合にのみ、次に構成されたミドルウェアを実行します。

19
Daniel J.G.