У меня есть сценарий, в котором мой сервер 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 Core - 3.1, версия SignalR - @ microsoft / signalR - 3.1.3
- IDE (VS / VS Code / VS4Mac), в которой вы работаете, и ее версия - локально Visual Studio 2019, в Azure - служба приложений Azure.