Как подключить пример приложения Spring SAML к Weblogic IDP?

  1. Я скачал пример приложения Spring SAML здесь: http://docs.spring.io/spring-security-saml/docs/current/reference/htmlsingle/#quick-start-steps
  2. Я запустил приложение и успешно прошел аутентификацию в SSOCircle IDP.
  3. Затем я попытался переключиться на Weblogic IDP, но когда я пытаюсь выполнить аутентификацию, происходит сбой с исключением.

Трассировка стека исключений:

Jun 17, 2015 10:33:31 AM org.apache.catalina.core.StandardWrapperValve invoke
    SEVERE: Servlet.service() for servlet [default] in context with path [] threw exception [org.opensaml.ws.message.encoder.MessageEncodingException: Unable to builder artifact for message to relying party] with root cause
    org.opensaml.ws.message.encoder.MessageEncodingException: Unable to builder artifact for message to relying party
            at org.opensaml.saml2.binding.encoding.HTTPArtifactEncoder.buildArtifact(HTTPArtifactEncoder.java:232)
            at org.opensaml.saml2.binding.encoding.HTTPArtifactEncoder.getEncode(HTTPArtifactEncoder.java:195)
            at org.opensaml.saml2.binding.encoding.HTTPArtifactEncoder.doEncode(HTTPArtifactEncoder.java:137)
            at org.opensaml.ws.message.encoder.BaseMessageEncoder.encode(BaseMessageEncoder.java:52)
            at org.springframework.security.saml.processor.SAMLProcessorImpl.sendMessage(SAMLProcessorImpl.java:227)
            at org.springframework.security.saml.processor.SAMLProcessorImpl.sendMessage(SAMLProcessorImpl.java:195)
            at org.springframework.security.saml.websso.AbstractProfileBase.sendMessage(AbstractProfileBase.java:144)
            at org.springframework.security.saml.websso.WebSSOProfileImpl.sendAuthenticationRequest(WebSSOProfileImpl.java:105)
            at org.springframework.security.saml.SAMLEntryPoint.initializeSSO(SAMLEntryPoint.java:226)
            at org.springframework.security.saml.SAMLEntryPoint.commence(SAMLEntryPoint.java:153)
            at org.springframework.security.saml.SAMLEntryPoint.doFilter(SAMLEntryPoint.java:107)
            at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
            at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)
            at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:166)
            at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
            at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
            at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
            at org.springframework.security.saml.metadata.MetadataGeneratorFilter.doFilter(MetadataGeneratorFilter.java:87)
            at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
            at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)
            at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)
            at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
            at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259)
            at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
            at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
            at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
            at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
            at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504)
            at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
            at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
            at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
            at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
            at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421)
            at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1074)
            at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
            at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
            at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
            at java.lang.Thread.run(Thread.java:745)

В журнале есть еще одно сообщение, в котором говорится:

Конечная точка службы разрешения артефактов не определена для объекта null

  1. Что я могу сделать для успешного разрешения артефактов? Я отладил приложение и обнаружил, что метод org.opensaml.saml2.binding.artifact.SAML2ArtifactType0004Builder#getAcsEndpoint() возвращает значение null, что вызывает указанное выше исключение. . Я не совсем уверен, что это значит и что нужно сделать, чтобы это сработало.
  2. Я экспортировал метаданные IDP и включил их в bean-компонент поставщика метаданных, а затем, в свою очередь, экспортировал метаданные SP и загрузил их в Weblogic в качестве метаданных федеративного партнера. Я что-то пропустил?

Я попытался сделать так, чтобы пример приложения аутентифицировался в отношении Weblogic IDP и Shibboleth IDP, но мне не удалось заставить его работать. Либо конфигурация не полная, либо я упускаю что-то фундаментальное.


person Jakub Hlavatý    schedule 18.06.2015    source источник


Ответы (2)


<сильный>1. Добавить сопоставление учетных данных

Чтобы включить функциональность SAML, нам сначала нужно добавить сопоставление учетных данных. Откройте консоль администрирования Weblogic.

http://server:port/console
e.g.
http://127.0.0.1:7101/console

<сильный>1.1. Добавить запись сопоставления

1.1.1. Перейдите на страницу сопоставления учетных данных:

Security Realms > myrealm > Providers > Credential Mapping

1.1.2. Нажмите новую кнопку

  • Введите имя сопоставления (например, SamlCredentialMapper)
  • Выберите тип SAML2CredentialMapper.
  • Сохраните новое сопоставление

1.1.3. Нажмите на новое сопоставление

  • Перейдите на вкладку «Специфический провайдер».
  • Введите URI эмитента:

    например http://www.server.com/issuer

  • Сохраните сопоставление

<сильный>2. Настройка свойств SAML

<сильный>2.1. Перейдите на страницу серверов

  • Откройте запись сервера для сервера администрирования.
  • Обратите внимание на значения Listen Address и Listen Port на вкладке General.

2.2. Перейдите в раздел Службы федерации > Общие сведения о SAML 2.0.

  • Введите значение для URL-адрес опубликованного сайта (хост и порт должны совпадать со значениями, которые вы указали на предыдущем шаге):

    например http://localhost:7101/saml2

  • Введите Идентификатор объекта (обратите внимание, что этот идентификатор ДОЛЖЕН БЫТЬ таким же, как URI эмитента, который вы ввели ранее)

    например http://www.server.com/issuer

  • Должен совпадать с URI эмитента из сопоставления учетных данных.

  • Сохраните настройки

2.3. Перейдите на вкладку "Поставщик удостоверений SAML 2.0"

  • Установите флажок «Включено».
  • Выберите POST в качестве предпочтительной привязки.
  • Сохраните настройки.

<сильный>3. Обмен метаданными

3.1. Экспорт метаданных поставщика идентификационной информации

Файл метаданных поставщика удостоверений используется приложением поставщика услуг (клиент единого входа) для определения URL-адресов входа и другой полезной информации.

3.1.1. Перейдите в раздел Службы федерации > Общие сведения о SAML 2.0.

  • Нажмите кнопку «Опубликовать метаданные».
  • Select a file name for the metadata file
    • by entering a path / file name in the Path text field
    • ИЛИ выбрав существующий файл в структуре каталогов (вы должны установить флажок «Перезаписать», чтобы перезаписать файл)
  • Нажмите OK, чтобы экспортировать файл метаданных.

3.2. Используйте файл метаданных в приложении поставщика услуг

Приложение поставщика услуг должно знать, где найти IDP. Эта информация содержится в файле метаданных IDP.

3.3. Получите файл метаданных поставщика услуг

IDP также должен знать о поставщике услуг (клиенте системы единого входа). Вам необходимо получить файл метаданных SP.

3.4. Настройка партнера поставщика услуг

  • Перейдите к созданному ранее сопоставлению учетных данных.
  • Перейдите на вкладку «Управление».
  • Создайте нового партнера-поставщика услуг единого входа в Интернет.
  • выберите имя (или оставьте по умолчанию)
  • Выберите файл метаданных SP, перейдя в каталог и выбрав существующий файл в структуре каталогов.
  • Нажмите OK, чтобы сохранить нового партнера.
  • Нажмите на нового партнера поставщика услуг.
  • Установите флажок «Включено».
  • Нажмите Сохранить.

Ссылки

person Jakub Hlavatý    schedule 30.06.2015

Какую версию Weblogic вы используете? По крайней мере, в более старых версиях консультанты Oracle сказали мне, что поддержка Weblogic SAML IDP не является «качеством производства», и реализация действительно имела проблемы (такие как использование старых библиотек, отсутствие поддержки шифрования SAML, обработка ошибок), но это могло измениться с тех пор. .

Ошибка «Нет конечной точки службы разрешения артефактов» предполагает, что метаданные вашего IDP не имеют ArtifactResolutionEndpoint в своих метаданных. На вашем месте я бы попытался использовать привязку HTTP-POST вместо Artifact.

person Vladimír Schäfer    schedule 24.06.2015
comment
Мы используем Weblogic 10.3.6 с Oracle Webcenter 11.1.1.7. - person Jakub Hlavatý; 24.06.2015
comment
В метаданных IDP указан URL-адрес службы разрешения артефактов, например: ‹md:ArtifactResolutionService Binding=urn:oasis:names:tc:SAML:2.0:bindings:SOAP Location=localhost:7101/saml2/idp/ars/soap index=0 isDefault=true/› Простое открытие URL-адреса в браузере вызывает исключение NullPointerException. Из того, что я узнал до сих пор, это похоже на особенность Weblogic и другого программного обеспечения Oracle, а не на ошибку :-) - person Jakub Hlavatý; 24.06.2015
comment
Я пытаюсь заставить эту штуку работать, и я изучаю всю теорию SSO и SAML по ходу дела, поэтому я не могу свободно разбираться во всех тонкостях. Я почему-то предположил, что HTTP-POST будет использоваться по умолчанию, и я не совсем уверен, как работают другие привязки. - person Jakub Hlavatý; 24.06.2015
comment
Я спросил о NPE с поддержкой Oracle, но они просто сказали, что мне нужно попробовать аутентификацию с помощью реального приложения SP, чтобы проверить, работает ли оно. Я просто не уверен, какая сторона виновата в ошибке (как я уже сказал, я не эксперт в SSO/SAML). - person Jakub Hlavatý; 24.06.2015
comment
Я попробую переключиться на HTTP-POST и посмотрю, поможет ли это. - person Jakub Hlavatý; 24.06.2015
comment
Публикация ваших метаданных и сообщений, которыми вы обмениваетесь, позволит устранить неполадки даже с привязкой артефакта. Без этого это просто стрельба в темноте. Подробную информацию о том, как включить подробное ведение журнала с этими данными, можно найти в руководстве Spring SAML. - person Vladimír Schäfer; 24.06.2015
comment
Я думаю, что проблема теперь на стороне Weblogic, так как я нашел сообщение в журнале, в котором говорилось: «24 июня 2015 г., 12:39:16 UTC» ‹Ошибка› ‹Безопасность› ‹BEA-090824› ‹Невозможно сгенерировать SAML Утверждение: нет сопоставления имен для «Subject: 1 Principal = class weblogic.security.principal.WLSKernelIdentity(‹WLS Kernel›) »› - person Jakub Hlavatý; 24.06.2015
comment
Во всяком случае, вот мои метаданные IDP pastebin.com/AEXVyrdP и метаданные SP pastebin.com/JPuaez55 - person Jakub Hlavatý; 24.06.2015
comment
Ошибка в журнале совершенно очевидна — Weblogic не удалось сгенерировать утверждение: AuthNResponse;FAILURE;127.0.0.1;urn:test:entity:id;mycompany.com/issuer;;;org.opensaml.common.SAMLException: ответ имеет недопустимый код состояния urn:oasis:names:tc :SAML:2.0:status:Responder, сообщение о состоянии: [Security:096578]Невозможно сгенерировать утверждение для пользователя. То, которое вы получали ранее, скорее всего, было другим. - person Vladimír Schäfer; 24.06.2015
comment
Да, я видел это сообщение и сообщение из журнала Weblogic (см. мой предыдущий комментарий: stackoverflow.com/questions/30913648/ ). Я пытался погуглить, но пока не уверен, в чем причина. - person Jakub Hlavatý; 25.06.2015
comment
Как оказалось, я случайно добавил SAML2IdentityAsserter на вкладку «Аутентификация», пытаясь заставить все работать. Я просто поместил его туда, потому что не знал, что еще сделать, чтобы заставить его работать. Это не только не заставило его работать, но и помешало ему работать после того, как я решил другие проблемы. Теперь это работает. Я попытаюсь сделать это снова с нуля и опубликую правильный ответ. - person Jakub Hlavatý; 26.06.2015