У меня проблема с CORS при самообслуживании SignalR с OWIN, что происходит только при попытке включить аутентификацию.
Ошибка, которую я получаю в своем веб-браузере:
XMLHttpRequest не может загрузить http://.../signalr/negotiate?[snip] Происхождение... не разрешено Access-Control-Allow-Origin
Это происходит только в том случае, если я включаю проверку подлинности на своем самообслуживаемом сервере с помощью подхода в этом ответе:
public void Configuration(IAppBuilder app)
{
var listener = (HttpListener)app.Properties[typeof(HttpListener).FullName];
listener.AuthenticationSchemes = AuthenticationSchemes.Ntlm;
app.MapHubs(new HubConfiguration { EnableCrossDomain = true });
}
Если я прокомментирую строку AuthenticationSchemes
, то работает CORS (и я проверил все в эти инструкции). Я получаю ту же проблему, если я использую другие схемы аутентификации, чем NTLM.
Используя Fiddler, чтобы проверить, что происходит, без проверки подлинности я вижу, что необходимые заголовки CORS возвращаются с сервера:
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: [мой сервер]
Однако после включения проверки подлинности я получаю ответ 401, в котором отсутствуют эти заголовки. Все запросы имеют необходимый заголовок Origin
.
Изучив исходный код SignalR похоже, что заголовки устанавливаются, но, предположительно, с помощью аутентификации HttpListener
отправляет начальный ответ 401 без удара этого кода.
Итак, я думаю, что мой вопрос: как мне включить HttpListener
заголовок Access-Control-Allow-Origin
в его согласовании протоколов аутентификации?