web-dev-qa-db-ja.com

ASP.NET CoreでCORSを有効にする方法

ASP.NET Core Web APIでクロスオリジンリソース共有を有効にしようとしていますが、動けなくなります。

EnableCors属性は、パラメータとしてpolicyName型のstringを受け入れます。

// Summary:
//     Creates a new instance of the Microsoft.AspNetCore.Cors.Core.EnableCorsAttribute.
//
// Parameters:
//   policyName:
//     The name of the policy to be applied.
public EnableCorsAttribute(string policyName);

policyNameとはどういう意味ですか?またASP.NET Core Web APIでCORSを構成するにはどうすればよいですか。

128
Oluwafemi

アプリケーションの起動時にConfigureServicesメソッドでCORSポリシーを設定する必要があります。

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(o => o.AddPolicy("MyPolicy", builder =>
    {
        builder.AllowAnyOrigin()
               .AllowAnyMethod()
               .AllowAnyHeader();
    }));

    // ...
}

CorsPolicyBuilderbuilderを使用すると、必要に応じてポリシーを設定できます。この名前を使用して、ポリシーをコントローラとアクションに適用できます。

[EnableCors("MyPolicy")]

またはそれをすべてのリクエストに適用します。

public void Configure(IApplicationBuilder app)
{
    app.UseCors("MyPolicy");

    // ...
}
214
Henk Mollema

これは.Net-Core 1.1用です

残念ながら、この特定のケースではドキュメントは非常に混乱します。だから私はそれを簡単にするつもりだ:

  • プロジェクトにMicrosoft.AspNetCore.Cors nugetパッケージを追加します
  • ConfigureServicesメソッドにservices.AddCors();を追加します
  • Configureメソッドで、app.UseMvc()およびapp.UseStaticFiles()を呼び出す前に、次のコードを追加してください。

    app.UseCors(builder => builder
        .AllowAnyOrigin()
        .AllowAnyMethod()
        .AllowAnyHeader()
        .AllowCredentials());
    

それでおしまい。すべてのクライアントがあなたのASP.NET Core Webサイト/ APIにアクセスできます。

.Net-Core 2.0の場合

  • プロジェクトにMicrosoft.AspNetCore.Cors nugetパッケージを追加します
  • ConfigureServicesメソッドで、services.AddMvc()を呼び出す前に、以下を追加します。

     services.AddCors(options =>
        {
            options.AddPolicy("AllowAll",
                builder =>
                {
                    builder
                    .AllowAnyOrigin() 
                    .AllowAnyMethod()
                    .AllowAnyHeader()
                    .AllowCredentials();
                });
        });
    
  • Configureメソッドで、app.UseMvc()を呼び出す前に、app.UseCors("AllowAll");を追加します。

    AllowAllはapp.UserCorsで言及する必要があるポリシー名です。どんな名前でもかまいません。

83
Vahid Amiri

に基づいて Henk's answer 私は特定のドメイン、許可したい方法、そしてCORSを有効にしたいヘッダを考え出すことができました。

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(options =>
         options.AddPolicy("AllowSpecific", p => p.WithOrigins("http://localhost:1233")
                                                   .WithMethods("GET")
                                                   .WithHeaders("name")));
    services.AddMvc();
}

使用法:

[EnableCors("AllowSpecific")]
31
Oluwafemi

Startup.csクラスで設定する必要があります

services.AddCors(options =>
        {
            options.AddPolicy("CorsPolicy",
                builder => builder.AllowAnyOrigin()
                .AllowAnyMethod()
                .AllowAnyHeader()
                .AllowCredentials());
        });
4

特にSignalRを使ったdotnet core 2.2では変更しなければなりません

.WithOrigins("http://localhost:3000")または

.SetIsOriginAllowed(isOriginAllowed: _ => true) //for all origins

代わりに.AllowAnyOrigin().AllowCredentials()

https://trailheadtechnology.com/breaking-change-in-aspnetcore-2-2-for-signalr-and-cors/

https://github.com/aspnet/AspNetCore/issues/448

2
PJ3

IISでホスティングしている場合、考えられる理由の1つは、IISがOPTIONS動詞をブロックしているためです。このため、私はほぼ1時間費やしました。

1つのわかりやすい指示は、OPTIONSリクエスト中に404エラーが発生していることです。

これを修正するには、OPTIONSリクエストをブロックするように明示的にIISではなくに指示する必要があります。

リクエストフィルタリングに行きます:

IIS Request Filtering

OPTIONSが許可されていることを確認してください。

Make sure OPTIONS is True

または、以下の設定でweb.configを作成してください:

<system.webServer>
    <security>
        <requestFiltering>
            <verbs>
                <remove verb="OPTIONS" />
                <add verb="OPTIONS" allowed="true" />
            </verbs>
        </requestFiltering>
    </security>
</system.webServer>
2
Rosdi Kasim

`

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddCors(options =>
        {
            options.AddPolicy("AllowAnyOrigin",
                builder => builder
                .AllowAnyOrigin()
                .AllowAnyMethod()
                .AllowAnyHeader());
        });

        services.Configure<MvcOptions>(options => {
            options.Filters.Add(new CorsAuthorizationFilterFactory("AllowAnyOrigin"));
        });            
    }

`

2
Nathan Alard