Shibboleth SP передает приложению неверный идентификатор пользователя

#saml #adfs2.0 #shibboleth

#saml #adfs2.0 #shibboleth

Вопрос:

У меня есть приложение Rails, которое я доработал с помощью Shibboleth SP (последняя версия — 2.4.2). Я использую его с Apache 2.2. Мой IdP — сервер MS AD FS 2.0.

Кажется, все работает хорошо — пользователи заходят на сайт, перенаправляются на AD FS, проходят аутентификацию, а затем возвращаются и регистрируются на сайте.

Проблема в том, что после того, как вы это сделали, практически невозможно своевременно войти в систему под именем другого пользователя. Вы можете очистить все свои файлы cookie (я пытаюсь сделать это с Safari и Chrome на Mac) и перезапустить браузер, но если я сначала пройду аутентификацию как Алиса, а затем попытаюсь войти в систему как Кэрол, я все равно войду в приложение как Алиса.

Ответ SAML, полученный shibd после очистки файлов cookie, содержит правильный идентификатор:

 <AttributeStatement>
  <Attribute Name="http://schemas.xmlsoap.org/claims/CommonName">
    <AttributeValue>Carol</AttributeValue>
  </Attribute>
  <Attribute Name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress">
    <AttributeValue>carol@dev.REDACTED.com</AttributeValue>
  </Attribute>
  <Attribute Name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn">
    <AttributeValue>carol@dev.REDACTED.com</AttributeValue>
  </Attribute>
</AttributeStatement>
  

Но когда Shibboleth SP передает переменные среды в мое приложение, оно вместо этого отправляет неправильные учетные данные:

 [DEBUG 05/19 16:30:09]   ENV:  Shib-Session-ID => _615014991ed1b7dcc43f647ceb1f4944
[DEBUG 05/19 16:30:09]   ENV:  Shib-Identity-Provider => http://REDACTED/adfs/services/trust
[DEBUG 05/19 16:30:09]   ENV:  Shib-Authentication-Instant => 2011-05-19T21:17:23.861Z
[DEBUG 05/19 16:30:09]   ENV:  Shib-Authentication-Method => urn:federation:authentication:windows
[DEBUG 05/19 16:30:09]   ENV:  Shib-AuthnContext-Class => urn:federation:authentication:windows
[DEBUG 05/19 16:30:09]   ENV:  Shib-Session-Index => _cadfb4e6-ffb2-45f9-aab5-6bce8c3bc17a
[DEBUG 05/19 16:30:09]   ENV:  cn => alice
[DEBUG 05/19 16:30:09]   ENV:  email => alice@dev.REDACTED.com
[DEBUG 05/19 16:30:09]   ENV:  principal => alice@dev.READACTED.com
  

Несмотря на удаление всех файлов cookie, идентификатор Shib-Session-ID будет тем же самым. Каким-то образом это, похоже, связывает два взаимодействия и восстанавливает существующий сеанс, а не создает новый сеанс с информацией об учетной записи из ответа SAML.

Я установил все значения тайм-аута кэша, которые я могу найти, равными 60 секундам, но ожидания 2-3 минут с закрытым браузером недостаточно, чтобы заставить его создать новый сеанс.

 <StorageService type="Memory" id="mem" cleanupInterval="60"/>
<SessionCache type="StorageService" StorageService="mem" cacheTimeout="60" 
   inprocTimeout="60" cleanupInterval="60" />
  

 <Sessions lifetime="60" timeout="60" checkAddress="false" relayState="ss:mem"
    handlerSSL="false">
  

Перезапуск apache и shibd работает, как и закрытие браузера и оставление его в покое на долгое время (10-15 минут?) У меня нет четкого представления о том, сколько именно времени это занимает.

Чего я не понимаю? Какие еще пути мне следует использовать?

Ответ №1:

Главное в том, что наше приложение — это приложение Rails, развернутое с использованием Passenger. Похоже, что Passenger не обновлял переменные среды после первого вызова, поэтому вы могли получить старые данные.

Переключение на передачу информации о пользователе через заголовки (ShibUseHeaders включено) решило проблему.