Переопределение глобальной политики CORS другой политикой для конечной точки signalR - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть глобальная политика CORS, которая применима для всех конечных точек, но я хочу переопределить эту политику для конечной точки хаба signalR.

Вот мой метод ConfigureServices, который имеет глобальную политику CORS, которую я не могу modify

    public void ConfigureServices(IServiceCollection services)
    {    
       // some piece of code before adding CORS

        services.AddCors(o =>
        {
            o.AddDefaultPolicy(p =>
            {
                p.AllowAnyOrigin()
                    .AllowAnyHeader()
                    .AllowAnyMethod();
            });
        });

        // some piece of code after adding CORS
    }

Вот метод Configure

    public void Configure(IApplicationBuilder app, IServiceProvider serviceProvider)
    {
        app.UseCors();
        app.UseRouting();
        app.UseAuthentication();
        app.UseAuthorization();

        app.UseEndpoints(endPoints =>
        {
            endPoints.MapControllers();
            endPoints.MapHub<NotificationHub>("/notificationHub")
            .RequireCors((builder) =>
            {
                builder
                .WithOrigins(_configuration.GetValue<string>("Settings:ClientAppUrl"))
                .AllowAnyMethod()
                .AllowAnyHeader()
                .AllowCredentials();
            });
        });
    }

Поскольку ясно, что я переписал политику CORS для конкретной конечной точки сигнала, которая является /notificationHub.

Я получаю ту же ошибку CORS в браузере, что и перед добавлением политики CORS для / messagesHub /gotiate

Ответ на предварительный запрос не проходит проверку контроля доступа: значение заголовка «Access-Control-Allow-> Credentials» в ответе «», который должен иметь значение «true», если режим учетных данных запроса>> include. Режим учетных данных запросов, инициируемых XMLHttpRequest, управляется атрибутом> withCredentials.

Также обратите внимание, что если я добавлю метод AllowCredentials () в глобальную политику CORS, то signalR будет работать правильно, но моя цель здесь состоит в том, чтобы добавить новую политику CORS только для конечной точки signalR.

Я не использую OWIN CORS, это просто Microsoft.AspNetCore.Cors.

1 Ответ

1 голос
/ 29 апреля 2020

Я нашел исправление для этого. Это просто, но часто игнорируется.

Здесь очень важен порядок промежуточного программного обеспечения. Поменяв местами два промежуточных ПО, я заработал.

СТАРЫЙ

app.UseCors();
app.UseRouting();

NEW

app.UseRouting();
app.UseCors();

Если кто-то сталкивался с этой проблемой, попробуйте сделать это. Это определенно сработает.

Это do c от Microsoft поддерживает это утверждение.

...