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


190

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平均してどのように私は設定できCORSを ASP.NETコアのWeb APIに?


回答:


328

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

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

    // ...
}

CorsPolicyBuilder中には、builderあなたのニーズにポリシーを設定することができます。この名前を使用して、コントローラとアクションにポリシーを適用できます。

[EnableCors("MyPolicy")]

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

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

    // ...

    // This should always be called last to ensure that
    // middleware is registered in the correct order.
    app.UseMvc();
}

12
app.UseCors( "MyPolicy")がAPIエンドポイントで機能しないことがわかりました。問題のコントローラーエンドポイントを明示的に[EnableCors( "MyPolicy")]する必要がありました。
robbpriestley 2016年

9
公式ドキュメントから:「アプリケーション全体でCORSを有効にするには、UseCors拡張メソッドを使用してリクエストパイプラインにCORSミドルウェアを追加します。CORSミドルウェアは、クロスオリジンリクエスト(たとえば。UseMvc)を呼び出す前に。」
Alex Klaus

2
app.AddMvc()の後にapp.UseCors()を追加しましたが、機能しませんでした。使用方法の順序がミドルウェアの動作に影響するためです!
Obay Abd-Algader

1
出所を許可するリスクはありますか?
パーシー

Microsoft.AspNetCore.Cors nugetパッケージがないため、この回答はうまくいきませんでした。
レベン社製

108

.NET Core 1および.Net Core 2(さらに下)に適用

使用する場合 .Net-Core 1.1

残念ながら、この特定のケースではドキュメントは非常に混乱しています。だから私はそれを完全にシンプルにする:

  • Microsoft.AspNetCore.Corsnugetパッケージをプロジェクトに追加する
  • では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.Corsnugetパッケージをプロジェクトに追加する
  • ConfigureServicesメソッド、前に呼び出しservices.AddMvc()、追加します。

     services.AddCors(options =>
        {
            options.AddPolicy("AllowAll",
                builder =>
                {
                    builder
                    .AllowAnyOrigin() 
                    .AllowAnyMethod()
                    .AllowAnyHeader()
                    .AllowCredentials();
                });
        });
  • (重要)Configureメソッド、前に呼び出してapp.UseMvc()、アドオン app.UseCors("AllowAll");

    AllowAllapp.UserCorsで言及する必要があるポリシー名です。任意の名前にすることができます。


2
はい、そのうちの1つだけを有効にできると思いました!
eugeneK

7
ありがとう。UseMvcの後にAddCorsがあり、それが原因で正しく機能していませんでした。これについて言及する唯一の答えはあなたのものです。
JesseNewman19

1
これはうまくいかないと思います。資格情報を提供するときは、オリジンを許可することはできません。私はまだこれを機能させるために努力しています。
Jason Goemaat 2017年

7
それが重要な部分です:.UseCors()以前.UseMvc()
Neps

3
UserMvcの前にUseCorsを知らなかったために時間を無駄にした...助けてくれてありがとう!
トーマス

37

Henkの回答に基づいて、特定のドメイン、許可したいメソッド、および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")]

これは質問に対する答えを提供しません。批評したり、著者に説明を要求するには、投稿の下にコメントを残してください。
zrvan 2015

14
To critique or request clarification from an authorここではそうではないと思い、ヘンクの答えはすでにマークされています。特定のドメインを許可する場合の私の答えはアドオンでした。
オルワフェミ2015

コードに不足しているものがあります。「IServiceCollection」には「ConfigureCors」の定義が含まれていません。確認して、完全な答えを出してみてください。
Sami-L

@ Sami-L更新された回答を確認してください。にConfigureCors変更されたことがわかりましたAddCors
Oluwafemi

9

具体的には、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/4483


.NET CoreコンソールアプリでSignalRを使用すると、これが私のシナリオで唯一有効なソリューションになります。
asdf '10 / 10/19

7

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

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

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

リクエストフィルタリングに移動:

IISリクエストフィルタリング

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

OPTIONSがTrueであることを確認してください

または、web.config次の設定でを作成するだけです。

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

7

Startup.csクラスで構成する必要があります

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

5

`

    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"));
        });            
    }

`


1
すでに配備されているブラウザのセキュリティを回避する素晴らしい方法。しないでください!
JCKödel

2
私はこれが反対票を投じられるべきではないと思います。これは「代替」方法です。「UseCors()」メソッドを使用するか、ネイサンがここで行ったようにグローバルMVCフィルターを追加できます。
Josh Mouch、2018年

これは.netコア2.2で動作し、app.UseCors( "AllowAnyOrigin");を追加します。"Configure"メソッド
Harry Sarshogh

「Microsoft.AspNetCore.Cors nugetパッケージをプロジェクトに追加する」ことが重要です。言及してくれてありがとう!
Mason Zhang、

5

これを.Net Core 3.1で次のように機能させました

1.必ずUseCorsコードをapp.UseRouting();の間に配置してください。およびapp.UseAuthentication();

        app.UseHttpsRedirection();

        app.UseRouting();
        app.UseCors("CorsApi");

        app.UseAuthentication();
        app.UseAuthorization();

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

2.次に、このコードをConfigureServicesメソッドに配置します。

services.AddCors(options =>
        {
            options.AddPolicy("CorsApi",
                builder => builder.WithOrigins("http://localhost:4200", "http://mywebsite.com")
            .AllowAnyHeader()
            .AllowAnyMethod());
        });

3.そしてベースコントローラーの上にこれを配置しました

[EnableCors("CorsApi")]
[Route("api/[controller]")]
[ApiController]
public class BaseController : ControllerBase

これで、すべてのコントローラーがBaseControllerを継承し、CORSが有効になります。


私まではうまくいかなかったplace the UseCors code between app.UseRouting(); and app.UseAuthentication();
0014

1

ステップ1:プロジェクトにMicrosoft.AspNetCore.Corsパッケージが必要です。インストールするには、ツール-> NuGetパッケージマネージャー->ソリューションのNuGetパッケージの管理に移動します。Microsoft.AspNetCore.Corsを検索し、パッケージをインストールします。

ステップ2:アプリケーションで使用できるように、コンテナにCORSを注入する必要があります。Startup.csクラスで、ConfigureServicesメソッドに移動してCORSを登録します。

ここに画像の説明を入力してください

したがって、サーバーアプリで、Controllers-> HomeController.csに移動して、EnableCorsデコレーターをIndexメソッド(または特定のコントローラーとアクション)に追加します。

ここに画像の説明を入力してください

詳細はこちらをクリック


0

上記の回避策はすべて機能する場合と機能しない場合があり、ほとんどの場合機能しません。私はここに解決策を与えました

現在、AngularとWeb API(.net Core)に取り組んでおり、以下で説明するCORSの問題に遭遇

上記のソリューションは常に機能します。「OPTIONS」リクエストでは、「匿名認証」を有効にする必要があります。ここで説明するソリューションを使用すると、IISの設定など、上記のすべての手順を実行する必要はありません。

とにかく誰かが私の投稿をこの投稿と重複しているとマークしましたが、この投稿はASP.net CoreでCORSを有効にするためだけのものですが、私の投稿はASP.net CoreおよびAngularでのCORSの有効化と実装に関連しています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.