CORS¶
IdentityServerの多くのエンドポイントは、JavaScriptベースのクライアントからのAjax呼び出しを介してアクセスされます。IdentityServerは、これらのクライアントとは異なる起点でホストされる可能性が高いため、CORS(Cross-Origin Resource Sharing)を設定する必要があります。
クライアントベースのCORS設定¶
CORSを構成する1つの方法はAllowedCorsOrigins、クライアント構成上でコレクションを使用することです。クライアントの起点をコレクションに追加するだけで、IdentityServerのデフォルト設定ではこれらの値を参照し、起点からのクロスオリジンコールを許可します。
注釈
CORSを設定するときは、必ずオリジン(URLではなく)を使用してください。例えば、:https://foo:123/はhttps://foo:123原点であるが、URLである。
このデフォルトのCORS実装は、私たちが提供する「メモリ内」またはEFベースのクライアント構成を使用している場合に使用されます。自分自身を定義する場合はIClientStore、独自のカスタムCORSポリシーサービスを実装する必要があります(下記参照)。
カスタムCORSポリシーサービス¶
IdentityServerを使用すると、ホスティングアプリケーションICorsPolicyServiceはCORSポリシーを完全に制御することができます。
実装する単一の方法は以下の通りです:。原点が許可されていれば返し、そうでなければ返します。Task<bool> IsOriginAllowedAsync(string origin)truefalse
実装したら、実装をDIに登録するだけで、IdentityServerはカスタム実装を使用します。
DefaultCorsPolicyService
許可された起点のセットを単純にハードコーディングしたいのであれば、ICorsPolicyServiceあなたが呼び出すことができる予めビルドされた実装がありますDefaultCorsPolicyService。これは、DI内のシングルトンとして構成され、そのAllowedOriginsコレクションでハードコードされるか、フラグAllowAllをtrueすべての起点を許可するように設定します。たとえば、次のようになりConfigureServicesます。
var cors = new DefaultCorsPolicyService(_loggerFactory.CreateLogger<DefaultCorsPolicyService>())
{
AllowedOrigins = { "https://foo", "https://bar" }
};
services.AddSingleton<ICorsPolicyService>(cors);
注釈
AllowAll慎重に使用してください。
IdentityServerのCORSポリシーとASP.NET CoreのCORSポリシーを¶
IdentityServerは、ASP.NET CoreのCORSミドルウェアを使用してCORSの実装を提供します。IdentityServerをホストするアプリケーションで独自のカスタムエンドポイント用のCORSが必要な場合もあります。一般的には、両方とも同じアプリケーションで連携する必要があります。
コードでは、IdentityServerに関係なく、ASP.NET Coreの文書化されたCORS機能を使用する必要があります。つまり、ポリシーを定義し、ミドルウェアを通常どおり登録する必要があります。アプリケーションがポリシーを定義ConfigureServicesしている場合は、CORSミドルウェアを構成する場所またはEnableCorsコントローラコードでMVC 属性を使用する場所と同じ場所で引き続き作業する必要があります。代わりにCORSミドルウェアを使用して(ポリシービルダーのコールバック経由で)インラインポリシーを定義すると、それも正常に機能し続けるはずです。
ASP.NET Core CORSサービスとIdentityServerの使用が競合するシナリオの1つは、カスタムを作成する場合ですICorsPolicyProvider。ASP.NET CoreのCORSサービスとミドルウェアが設計されているため、IdentityServerは独自のカスタムICorsPolicyProviderを実装し、DIシステムに登録します。幸いにも、IdentityServerの実装はICorsPolicyProvider、DIに既に登録されている既存のものをラップするためにデコレータパターンを使用するように設計されています 。つまりICorsPolicyProvider、実装することもできますが、IdentityServerの前にDIで登録する必要があります(例:in ConfigureServices)。