OIOSAML: проблема с настройками конечных точек службы

Я написал простую систему с SP-инициирующим сценарием SSO на основе OIOSAML. Чтобы протестировать систему, я развернул ее на удаленном хосте.

Однако AssertionConsumerServiceURL, где я указал URL-адрес, на который Shibboleth idP (idP на основе Shibboleth) должен вернуть ответ, не вызывается.

SAMLAssertionConsumer - просто простой сервлет, например:

@WebServlet("/saml/consumer")
public class SAMLAssertionConsumer extends HttpServlet {
 @Override
 protected void doPost(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException {

 System.out.println(new Date() + " incoming AuthResponse");
 }

 @Override
 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 response.setContentType("text/html");
 PrintWriter out = response.getWriter();
 out.println("Yes, it worked");

 System.out.println(new Date() + " incoming AuthResponse");
 }
}

Для начала я просто должен убедиться, что ответ приходит.

Мой web.xml:

<!--?xml version="1.0" encoding="UTF-8"?-->
<web-app id="WebApp_ID" version="3.0" metadata-complete="false" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

 <display-name>OIOSAML-J</display-name>

 <listener>
 <listener-class>dk.itst.oiosaml.sp.service.session.SessionDestroyListener</listener-class>
 </listener>

 <servlet>
 <servlet-name>SAMLDispatcherServlet</servlet-name>
 <servlet-class>dk.itst.oiosaml.sp.service.DispatcherServlet</servlet-class>
 <load-on-startup>1</load-on-startup>
 </servlet>

 <servlet-mapping>
 <servlet-name>SAMLDispatcherServlet</servlet-name>
 <url-pattern>/saml/*</url-pattern>
 </servlet-mapping>

 <filter>
 <filter-name>LoginFilter</filter-name>
 <filter-class>dk.itst.oiosaml.sp.service.SPFilter</filter-class>
 </filter>

 <filter-mapping>
 <filter-name>LoginFilter</filter-name>
 <url-pattern>/sp/*</url-pattern>
 </filter-mapping>

 <welcome-file-list>
 <welcome-file>index.jsp</welcome-file>
 </welcome-file-list>

</web-app>

Мои oiosaml-sp.properties:

# Properties used by oiosaml-j

# Reference to the location of the certificate used for signing SAML documents with - relative to ${oiosaml.home}
oiosaml-sp.certificate.location=./certificate/keystore

# Opaque/encrypted password to the certificate used for signing SAML documents
oiosaml-sp.certificate.password=some_password

# Required authentication level. 2=password, 3=certificate
oiosaml-sp.assurancelevel=2

# Name of the meta data file for the current service provider - overrides setting in brs-common.properties
common.saml2.metadata.sp.filename=SPMetadata.xml

# URI References to the current service provider
oiosaml-sp.uri.home=

# Whether to validate server certificates. Set to false in production.
# Used for artifact resolution.
oiosaml-sp.resolve.ignorecert=true

# Artifact resolution username and password. Only used the artifact profile is active.
oiosaml-sp.resolve.username=rolf.trifork.com
oiosaml-sp.resolve.password=rolf.trifork.com

Сгенерированный AuthnRequest:

<!--?xml version="1.0" encoding="UTF-8"?-->
<saml2p:authnrequest xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol" assertionconsumerserviceurl="http://ip-of-remote-system-here:8080/saml/consumer" destination="http://ip-of-identity-provider-here/idp/profile/SAML2/Redirect/SSO" forceauthn="false" id="_31e...341d322d1d" ispassive="false" issueinstant="2014-07-11T10:24:43.852Z" protocolbinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" version="2.0">
 <saml2:issuer xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion">http://ip-of-remote-system-here:8080</saml2:issuer>
</saml2p:authnrequest>

Существует некоторая JSP-страница private.jsp, я делаю запрос к ней:

http://ip-of-remote-system-here:8080/sp/private.jsp

После этого запроса я перенаправил на страницу входа поставщика удостоверений:

http://ip-of-identity-provider-here/idp/Authn/CommonLogin

Введите пару логин/пароль и ничего. Открывает страницу с описанием некоторой общей ошибки:

http://ip-of-identity-provider-here/idp/Authn/UsernamePasswordLogin

ошибка

При обработке запроса произошла ошибка.

Не работает и мой сервлет SAMLAssertionConsumer, консоль понятна. Но если я сделаю запрос на свой сервлет SAMLAssertionConsumer прямо:

http://ip-of-remote-system-here:8080/saml/consumer

Тогда это работает. Конечно.

Я хотел бы знать, как правильно настроить службу потребителей утверждений. Это часть SP-метаданных, где я указываю потребителя утверждений.

<md:entitydescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" xmlns:esia="urn:esia:shibboleth:2.0:mdext" entityid="http://ip-of-remote-system-here:8080">
...
</md:entitydescriptor>

Я был бы очень благодарен за информацию. Спасибо всем.

1 ответ

Проблема была другая. Использовалось неправильное хранилище ключей. Теперь все в порядке.

Первоначально я предполагал, что атрибут entityID должен ссылаться на доменное имя, указанное в атрибутах Location. Однако это не так. Он просто должен быть уникальным, и для этого лучше использовать доменное имя.

UnderstandingShibboleth, EntityNaming:

Аудиторы и поставщики услуг Shibboleth используются в развертываниях SAML, и поэтому им назначается уникальное имя, известное как "идентификатор сущности".

Метаданные для языка разметки безопасности безопасности OASIS (SAML) V2.0, 2.3.2 Элемент:

<code>entityID</code> [обязательно] -

<pre class="prettyprint linenums"> Specifies the unique identifier of the SAML entity whose metadata is described by the element contents. </pre>

UnderstandingShibboleth, EntityNaming:

Настоятельно рекомендуется НЕ использовать физическое имя хоста сервера, на котором запущен Shibboleth, как <code>entityID</code>. Со временем все перемещается, и развертывание может не всегда работать в одном окне.

Кроме того, может быть несколько логических развертываний Shibboleth на одном физическом сервере, каждый из которых требует свой собственный уникальный <code>entityID</code>, поэтому использование имени сервера не масштабируется за пределы одного.

В песочнице можно использовать физические адреса.

licensed under cc by-sa 3.0 with attribution.