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 Элемент:

entityID [обязательно] -

Specifies the unique identifier of the SAML entity whose metadata is 
 described by the element contents.

UnderstandingShibboleth, EntityNaming:

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

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

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

licensed under cc by-sa 3.0 with attribution.