У меня есть сценарий, когда мой сервер и клиент SignalR не могут работать в одном источнике, потому что мы хотели бы использовать сервер SignalR более чем для одного источника. Когда я запускаю сервер локально и запускаю экземпляр веб-клиента signalR, работающего на машинописном компьютере, я могу подключиться, и все работает. Когда я перемещаю свой сервер на Azure и использую тот же локально работающий клиент signalR для подключения к серверу, я получаю предварительный запрос, не проходящий проверку контроля доступа. В службе приложений Azure нет настроек COR. Все настройки Cors сделаны в коде сервера. Код ниже.
Ошибка, которую я получаю в браузере: Доступ к XMLHttpRequest по адресу https: //******.azurewebsites.net/chatHub/negotiate ?gotiateVersion = 1 'from origin' https://localhost: 44392 'заблокировано политикой CORS: Ответ на запрос предварительной проверки не проходит проверку контроля доступа: Перенаправление не разрешено для запроса предварительной проверки. Это работает, как и ожидалось, локально, но в конечном итоге не работает правильно при запуске в Azure и подключении с локального клиента.
Для воспроизведения
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options => options.AddPolicy("MyCorsPolicy", builder =>
{
builder
.AllowAnyHeader()
.WithOrigins("https://localhost:44392/")
.SetIsOriginAllowed(origin =>
{
if (string.IsNullOrWhiteSpace(origin))
return false;
if (origin.ToLower().StartsWith("https://localhost"))
return true;
return false;
})
.AllowAnyMethod()
.AllowCredentials();
}));
... //Authentication etc
services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
}).AddJsonProtocol();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseCors("MyCorsPolicy");
app.UseAuthentication();
app.UseAuthorization();
app.UseHttpsRedirection();
app.UseEndpoints(endpoints =>
{
endpoints.MapGet("/", async context =>
{
await context.Response.WriteAsync("Ping!");
});
endpoints.MapHub<ChatHub>("/chatHub");
});
}
В клиенте с машинописным текстом я делаю запрос как следует:
const connection = new HubConnectionBuilder()
.withUrl("https://******.azurewebsites.net/chatHub" , { accessTokenFactory: () => "TOKEN GOES HERE"})
.configureLogging(LogLevel.Information)
.build();
Дополнительные технические данные
- ASP. NET Версия ядра - 3.1, версия SignalR - @ microsoft / signalR - 3.1.3
- IDE (VS / VS Code / VS4Ma c), на которой вы работаете, и ее версия - локально визуальная студия 2019, в Azure - Azure службе приложений.