Ошибка Shibboleth SSO CORS

Наше приложение (AngularJS + REST) ​​защищено поставщиком услуг Shibboleth для SSO. Проблема заключается в том, что мы видим ошибки CORS при попытке сделать ajax-вызовы для служб REST, говоря, что перенаправление на IDP не удалось «Запрос между источниками заблокирован: та же политика происхождения запрещает чтение удаленного ресурса в»

Однако, если мы обновим/перезагрузим браузер, все будет работать нормально. Я считаю, что файл cookie не создается в первый раз, а создается после принудительной перезагрузки.

Очевидно, что это неприемлемое решение для обновления браузера каждый раз.

Что нужно сделать, чтобы это работало без перезагрузки?

Спасибо за любые указатели заранее.


person spal    schedule 06.10.2015    source источник


Ответы (1)


Сам занимаюсь этим вопросом. Я не верю, что в IDP Shibboleth есть какая-либо поддержка CORS, и решение, которое я использую, — это активный пинг проверки активности от клиента:

  • Периодически делайте Ajax-запрос к местоположению в сеансе аутентификации Shibboleth, чтобы предотвратить тайм-аут сеанса (например, с помощью setTimeout)
  • Если этот запрос завершится неудачно, выдаст ошибку полной страницы, которая предложит пользователю перезагрузить страницу с помощью что-то вроде этого< /а>

Пока вкладка браузера открыта и клиентский компьютер не спит, это предотвратит ошибки XHR такого рода по крайней мере для сеанс "время жизни":

продолжительность жизни(время в секундах) (по умолчанию 28800) Максимальная продолжительность в секундах, в течение которой сеанс, поддерживаемый SP, будет действительным. Фактическое время может быть меньше этого значения (если IdP указывает, что оно должно быть короче), но никогда не будет больше. Обратите внимание, что это не повлияет на сеансы, поддерживаемые приложением.

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

Я думаю, что это лучшее, что мы можем сделать без CORS в IDP!


Вот конфигурация Apache, которая в итоге сработала для меня на случай, если кто-нибудь еще попадет сюда:

RewriteEngine On

<Location />
    AuthType Shibboleth
    ShibUseHeaders On
    ShibRequireSession On
    Require valid-user
    AuthGroupFile /etc/httpd/groups
</Location>

RewriteCond "%{LA-F:REMOTE_USER}" =""
RewriteRule ^/session-ping$ /yoursessiondoesnotexist [PT,L]

<Location /yoursessiondoesnotexist>
    AuthType None
    Require all granted
</Location>

RewriteCond "%{LA-F:REMOTE_USER}" !=""
RewriteRule ^/session-ping$ /ok.html [PT,L]

Alias /ok.html /var/www/ok.html

SetEnvIf Request_URI "^/session-ping$" DONTLOG

CustomLog /dev/stdout ncgl env=!DONTLOG

Я опрашиваю /session-ping каждые пять секунд с помощью XHR и выбрасываю свой модальный/диммер «ваша сессия истекла», когда он получает код состояния, отличный от 200.

person spieden    schedule 12.02.2016