Запросы XHR завершаются с ошибкой при завершении сеанса аутентификации ADFS

У нас есть сайт, который опирается на федеративную аутентификацию с использованием служб федерации Active Directory (ADFS) и WSFederationAuthenticationModule.

На сайте также используется набор запросов XHR, инициированных при взаимодействии с пользователем. Одним из примеров является раскрывающееся меню, которое позволяет пользователю олицетворять других пользователей. Еще одна - это функция огранки на странице поиска по всему сайту.

Проблема в том, что сеанс истекает, когда пользователь остается неактивным на странице на определенное время. В обычных HTTP-запросах, когда пользователь нажимает на ссылку, например, это не проблема. По истечении срока действия сеанса пользователь перенаправляется на STS и незамедлительно возвращается обратно без уведомления пользователя - это происходит достаточно быстро.

Но запросы XHR терпят неудачу. Фактическое сообщение об ошибке в консоли:

XMLHttpRequest cannot load https://adfs.contoso.com/adfs/ls/... 
No 'Access-Control-Allow-Origin' header is present on the requested resource. 
Origin 'https://www.example.com' is therefore not allowed access.

Похоже, что запрос XHR не может перенаправляться на STS, а затем обратно к полагающейся стороне, как это происходит с обычным HTTP-запросом, поскольку это вызывает проблему CORS.

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

Каким будет правильный способ решить эту проблему?

2 ответа

Единственным решением, которое сработало для меня, был тот, который был предоставлен Pinpont в этом ответе: qaru.site/questions/1575846/...

Это то, что я сделал, чтобы реализовать скользящее окончание.

app.UseCookieAuthentication(new CookieAuthenticationOptions() 
{ 
 SlidingExpiration = false 
});
app.UseWsFederationAuthentication(
new WsFederationAuthenticationOptions
 {
 MetadataAddress = xxxxxxx,
 Wtrealm = xxxxxx,
 UseTokenLifetime = false,
 }

);

SlidingExpiration = false в CookieAuthenticationOptions

UseTokenLifetime = false в WsFederationAuthenticationOptions


Добавьте это в веб-конфигурацию в папке ADFS ls или в прокси-сервере ADFS, если вы используете ее.

<!--?xml version="1.0" encoding="utf-8"?-->
<configuration>
 <system.webserver>
 <httpprotocol>
 <customheaders>
 <add name="Access-Control-Allow-Origin" value="*">
 </add></customheaders>
 </httpprotocol>
 </system.webserver>
</configuration>

ref: http://enable-cors.org/server_iis7.html

licensed under cc by-sa 3.0 with attribution.