web-dev-qa-db-ja.com

CORSポリシーは、SignalRおよびASP.NETコアと連携したくない

ASP.NETコアAPIと私のAngularクライアントに問題があります。APIとAngularの間の接続を確立するためにSignalRを実装したいと思います。corsポリシーは、クライアントとAPIを使用すると、クライアントからAPIからデータを取得できますが、SignalRを使用しようとするとCORS POLICYでエラーが発生します。

Origin ' http:// localhost:42 'からの ' http:// localhost:50501/CoordinatorHub/negotiate 'でのXMLHttpRequestへのアクセスがCORSポリシーによってブロックされました:応答プリフライト要求はアクセス制御チェックに合格しません。要求されたリソースに「Access-Control-Allow-Origin」ヘッダーがありません。

しかし、APIのStartup.cs内にはすでにcorsポリシーがあり、次のようになっています。

ConfigureServicesメソッドで:

services.AddCors(options =>
{
    options.AddPolicy("AllowSpecificOrigin",
        builder => 
        builder.WithOrigins("http://localhost:4200/")
            .AllowCredentials()
            //.AllowAnyOrigin()
            .AllowAnyMethod()
            .AllowAnyHeader()
            .SetIsOriginAllowedToAllowWildcardSubdomains());
});

そして、Configureメソッドの内部:

app.UseCors("AllowSpecificOrigin");

クライアントでは、APIとクライアントの間の接続を確立しようとするだけで、次のようになります。

this.hubConnection.start({withCredentials: false}).then(() => 
     this.hubConnection.invoke('send', 'Hello'));
11

これは.net core 3.1に適用できます

Microsoftのドキュメントに記載されているように、動作しないようです docs

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    // Preceding code ommitted.
    app.UseRouting();

    app.UseCors();

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

    // Following code ommited.
}

警告

エンドポイントルーティングでは、UseRoutingとUseEndpointsの呼び出し間で実行されるようにCORSミドルウェアを構成する必要があります。構成が正しくないと、ミドルウェアが正しく機能しなくなります。

ただし、最初にUseCors()を移動すると、アプリケーションは期待どおりに機能するため、機能するコードは次のようになります。

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

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
//place your useCors here 
    app.UseCors();
    app.UseRouting();


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

    // Following code ommited.
}
1
BRAHIM Kamel

スタートアップ構成クラスで次のようなことを試してください:

app.Map("/CoordinatorHub/negotiate", map =>
{
    map.UseCors(CorsOptions.AllowAll);
    var hubConfiguration = new HubConfiguration 
    {
        // You can enable JSONP by uncommenting line below.
    // EnableDetailedErrors = true,
        // EnableJSONP = true

    };
    map.RunSignalR(hubConfiguration);
});
2
alim91

私はこれに従って私の問題を解決しました link

このブロックコードをサービスに追加

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

アプリの構成にこのブロックコードを追加します

app.UseCors("CorsPolicy");
app.UseSignalR(routes =>
        {
            routes.MapHub<General>("/hubs/general");
        });
0