Keycloak SAML как личный брокер с самым лучшим в качестве внешнего IdP.Неправильная конфигурация?Бесконечный цикл входа в систему? - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь реализовать функциональность 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 настроен следующим образом:

enter image description here

Для аутентификацииПоток браузера настроен на использование перенаправителя 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:

enter image description here

Я также пытался установить MASTERURL обработки saml к / saml, и я также попробовал конечную точку моего брокера IdP.Когда я пытаюсь пройти аутентификацию через https://samltest.id/, все заканчивается бесконечным циклом входа в систему.

Может кто-нибудь указать мне правильное направление?У меня неправильно настроена система?Я знаю, что об этом много спрашивали, но не смог найти ответ.Пожалуйста, не стесняйтесь спрашивать более подробную информацию / информацию о моих настройках / конфигурации.

Заранее спасибо и с уважением,

Мануэль

...