#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 включено) решило проблему.