Я пытаюсь реализовать функциональность SAML SP для моего приложения уже несколько недель.Сначала я попробовал picketlink, но не смог заставить его работать, и так как я увидел, что он устарел, я решил использовать keycloak в качестве альтернативы.Я также рассмотрел расширение Spring Saml, но я развернул на Wildfly 10, поэтому я хотел решение, которое хорошо интегрируется с Wildfly.
Я выполнил шаги на https://www.keycloak.org/docs/4.6/securing_apps/index.html#saml-2 для установки сервера keycloak (4.6.0.Final), обоих необходимых адаптеров и для настройки подсистемы wildfly (standalone.xml).Я прочитал много потоков о конфигурации клиента и настроил Keycloak как брокер IdP, импортировав внешние метаданные IdP из: https://samltest.id/saml/idp
Я также импортировал мой брокер IdP в виде файла метаданных SP на https://samltest.id/:
<EntityDescriptor xmlns="urn:oasis:names:tc:SAML:2.0:metadata" entityID="http://localhost:8180/auth/realms/prisma-keycloak-saml-idp">
<SPSSODescriptor AuthnRequestsSigned="true" WantAssertionsSigned="true"
protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol urn:oasis:names:tc:SAML:1.1:protocol http://schemas.xmlsoap.org/ws/2003/07/secext">
<KeyDescriptor use="signing">
<dsig:KeyInfo xmlns:dsig="http://www.w3.org/2000/09/xmldsig#">
<dsig:KeyName>Ovdow5dx1a_BxPju-WIV7_-LKmhBPUDGXMKEPsXoDYY</dsig:KeyName>
<dsig:X509Data>
<dsig:X509Certificate>MIICvzCCAacCBgFnUHFoLDANBgkqhkiG9w0BAQsFADAjMSEwHwYDVQQDDBhwcmlzbWEta2V5Y2xvYWstc2FtbC1pZHAwHhcNMTgxMTI2MTQzMjQ4WhcNMjgxMTI2MTQzNDI4WjAjMSEwHwYDVQQDDBhwcmlzbWEta2V5Y2xvYWstc2FtbC1pZHAwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC069gg6qpIEn61cp+kfqDnsTb93529dNPwmbs4ukxhOIFW7Ic6SsabDvvlokaC/fNOHcfLV8KSyTYcd4E8ESw65dGaGtBUwr2Egmq8U/KVOLxcjQStze6TZU3TAnaoU7ZhYXzCipnLEHMDzLSVUYUNVzX2cfNHwipGJvw8ribB51vKByn/LhyrhDfHGwmlP6Fkth3T0cKlN27x4s5zfBje1lp0uQagatUPcmwm51K3vSNHu1rz6CGOJviHVXu9T1T6adxw83Az6FK6Z+hNA/uzCYUafcY2xYK6z7nJiXVwbCg+ZYqRuWa/hjMZ3ViWb9J3iPGmjGfYQsYK5W/kyqiXAgMBAAEwDQYJKoZIhvcNAQELBQADggEBAAwfSPO+MY8JTaI5qRF11O3iiMh99wTy+V9NdYp1No2HRxfAZiZeGTgWusYgrO2bQ37BGVs6Iw/7XU/eSzOfeYVmWgm1XFvimVq9Z8FVKfH93CRnhbmgnPV2wKPIlmKjzV5KinjZfbuX/6hO3jCRaYk4B4RgNnnNX5yJEbhxQdtRsTpYyPbxrLcCRx37T/U+g+JuoW03H23rFssS4OcEgoMPSBfKDE/DJDypOyl75YB8C0t5zOidFN0LNbw428X2LG04ZcD9rvyND9u5SEVzAjWp2EM7QD6klhXPDIyGSEMjKSNC+IFMpAmZLsHAVih8o8NqsNMxmsuEXVVONI1M0EY=</dsig:X509Certificate>
</dsig:X509Data>
</dsig:KeyInfo>
</KeyDescriptor>
<SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="http://localhost:8180/auth/realms/prisma-keycloak-saml-idp/broker/prisma-keycloak-saml-idp/endpoint"/>
<NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified
</NameIDFormat>
<AssertionConsumerService
Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="http://localhost:8180/auth/realms/prisma-keycloak-saml-idp/broker/prisma-keycloak-saml-idp/endpoint"
index="1" isDefault="true" />
</SPSSODescriptor>
Мой IdP на Keycloak настроен следующим образом:
Для аутентификацииПоток браузера настроен на использование перенаправителя Identity Provider (prisma-keycloak-saml-idp) в качестве выполнения.
Мои приложения web-фрагмент.xml имеют следующую конфигурацию:
<web-fragment metadata-complete="true" version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-fragment_3_0.xsd">
<name>SAMLLoginFragment</name>
<servlet>
<servlet-name>PublicContentServlet</servlet-name>
<servlet-class>at.prismasolutions.ppcf.core.common.service.PublicContentServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>PublicContentServlet</servlet-name>
<url-pattern>/public/*</url-pattern>
</servlet-mapping>
<security-role>
<role-name>*</role-name>
</security-role>
<!-- protected -->
<security-constraint>
<web-resource-collection>
<web-resource-name>The protected resources</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>*</role-name>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>NONE</transport-guarantee>
</user-data-constraint>
</security-constraint>
<!-- unprotected -->
<security-constraint>
<web-resource-collection>
<web-resource-name>The unprotected resources</web-resource-name>
<url-pattern>/public/*</url-pattern>
</web-resource-collection>
<!-- note the missing auth-constraint -->
<user-data-constraint>
<transport-guarantee>NONE</transport-guarantee>
</user-data-constraint>
</security-constraint>
<login-config>
<auth-method>KEYCLOAK-SAML</auth-method>
<realm-name>this is ignored currently</realm-name>
</login-config>
<!-- Session Configuration -->
<session-config>
<cookie-config>
<path>/</path>
</cookie-config>
</session-config>
<filter>
<filter-name>SAMLAuthListenerFilter</filter-name>
<filter-class>at.prismasolutions.ppcf.core.auth.login.pvpsaml.SAMLAuthListenerFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SAMLAuthListenerFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
Предполагается, что фильтр выполняет программный вход в систему после аутентификации с помощью keycloak.Тем не менее он никогда не вызывается, так как я не прошёл процесс аутентификацииМой standalone.xml имеет конфигурацию keycloak для защиты my.war, которая является частью развертывания my.ear:
<subsystem xmlns="urn:jboss:domain:keycloak-saml:1.1">
<secure-deployment name="my.war">
<SP entityID="http://localhost:8080/my-app" sslPolicy="EXTERNAL" logoutPage="/logout.jsp">
<Keys>
<Key signing="true">
<KeyStore resource="/WEB-INF/saml/keystore.jks" password="password">
<PrivateKey alias="samlkey" password="password"/>
<Certificate alias="samlcert"/>
</KeyStore>
</Key>
<Key encryption="true">
<KeyStore resource="/WEB-INF/saml/keystore.jks" password="password">
<PrivateKey alias="samlkey" password="prismadmin"/>
</KeyStore>
</Key>
</Keys>
<IDP entityID="idp" signatureAlgorithm="RSA_SHA256" signatureCanonicalizationMethod="http://www.w3.org/2001/10/xml-exc-c14n#">
<SingleSignOnService signRequest="true" validateResponseSignature="true" validateAssertionSignature="true" requestBinding="POST" bindingUrl="http://localhost:8180/auth/realms/prisma-keycloak-saml-idp/protocol/saml"/>
<SingleLogoutService validateRequestSignature="true" validateResponseSignature="true" signRequest="true" signResponse="true" requestBinding="POST" responseBinding="POST" postBindingUrl="http://localhost:8180/auth/realms/prisma-keycloak-saml-idp/protocol/saml" redirectBindingUrl="http://localhost:8180/auth/realms/prisma-keycloak-saml-idp/protocol/saml"/>
</IDP>
</SP>
</secure-deployment>
</subsystem>
Домен безопасности также настроен в файле jboss-web.xml, содержащемся в защищенном .war.subdeployment.
<security-domain name="keycloak">
<authentication>
<login-module code="org.keycloak.adapters.jboss.KeycloakLoginModule" flag="required"/>
</authentication>
</security-domain>
У меня также есть конфигурация keycloak для клиента SAML:
Я также пытался установить MASTERURL обработки saml к / saml, и я также попробовал конечную точку моего брокера IdP.Когда я пытаюсь пройти аутентификацию через https://samltest.id/, все заканчивается бесконечным циклом входа в систему.
Может кто-нибудь указать мне правильное направление?У меня неправильно настроена система?Я знаю, что об этом много спрашивали, но не смог найти ответ.Пожалуйста, не стесняйтесь спрашивать более подробную информацию / информацию о моих настройках / конфигурации.
Заранее спасибо и с уважением,
Мануэль