3

我正在尝试将 JBoss EAP 7.0 用作 SAML 服务提供程序,“大部分”配置了它,但在我作为 SP 部署的应用程序抛出 403 时在最后一步出现问题。我在调试时遇到问题注销 JBoss/PicketLink 以进一步排除故障。

联合流程主要工作 - 我从我的 SP 应用程序开始。签名的 authnRequest 将发送给我的 IDP(不是 JBoss)。IDP 正在接受请求,要求我登录,然后生成签名的断言并将其 POST 回我在 JBoss 上的 SP 应用程序。此时我收到 403。

所以我知道PicketLink 子系统(我通过JBoss 控制台配置)已部署并正在工作,否则我一开始就永远不会得到签名的authnRequest。

现在我正在尝试进行一些调试,以便进一步排除故障。我发现一些较旧的文档引用了 picketlink.xml 中的 EnableAuditing 属性,但这显然早于子系统配置方法。

我尝试为 PicketLink 创建一个日志文件,该日志文件包含来自 org.picketlink.common 的消息,但仅此而已。不会从实际的联合活动中创建任何消息,即使是 authnRequest 创建也是如此。

我的standalone.xml 文件包含以下新元素(全部通过控制台创建,日志记录部分除外):

       <periodic-rotating-file-handler name="PICKETLINK" autoflush="true">
            <formatter>
                <named-formatter name="PATTERN"/>
            </formatter>
            <file relative-to="jboss.server.log.dir" path="picketlink.log"/>
            <suffix value=".yyyy-MM-dd"/>
            <append value="true"/>
        </periodic-rotating-file-handler>
        <logger category="org.picketlink">
            <level name="DEBUG"/>
            <handlers>
                <handler name="PICKETLINK"/>
             </handlers>
          </logger>

和 PickeLink 子系统:

    <subsystem xmlns="urn:jboss:domain:picketlink-federation:2.0">
        <federation name="jboss-sp">
            <identity-provider name="my-idp" url="https://********" security-domain="sp" external="true" support-signatures="true">
                <trust>
                    <trust-domain name="***"/>
                    <trust-domain name="***:18080"/>
                    <trust-domain name="***:18443"/>
                </trust>
            </identity-provider>
            <service-providers>
                <service-provider name="testapp-war-0.0.5-SNAPSHOT-default.war" security-domain="sp" url="http://***:18080/testapp/protected"/>
                <service-provider name="testapp-war-0.0.5-SNAPSHOT-secured.war" security-domain="sp" url="http://***:18080/testapp/protected" support-signatures="true"/>
            </service-providers>
            <key-store file="D:\\JBoss\\SSL\\samplepartner.jks" password="password" sign-key-alias="samplepartner" sign-key-password="password">
                <keys>
                    <key name="***" host="***"/>
                </keys>
            </key-store>
        </federation>
    </subsystem>

任何建议表示赞赏,谢谢!

4

1 回答 1

1

我建议您查看 keycloak saml 适配器,因为 pickelink 已被弃用。

一些有用的链接: https ://www.keycloak.org/docs/latest/securing_apps/#_saml-general-config

如何使用 keycloak-saml 适配器将第三方 IdP SAML 属性映射到我的本地应用程序角色

您还将获得更好的日志记录活动,只需添加这样的记录器:

        <logger category="org.keycloak.saml">
            <level name="DEBUG"/>
        </logger>

现在,回到 Picketlink 和你原来的问题。

关于 403 错误,请确保您在会话中获得了正确的角色。实际上,如果您检查 github 中的代码,您将不会看到太多的日志记录语句……我知道这有点令人失望。

您可以使用不安全的 JSP 来查看您拥有的角色。

<p>Is in role XXXX <%= request.isUserInRole("XXXX") %> </p>

如果您仍想使用我不推荐的 picketlink 探索解决方案,我将在此处留下一个曾经为我工作的配置。

注意: 1) 在安全域部分声明一个审计提供者。2) 如果您不控制来自 IdP 服务器的角色,它会使用角色映射器,这很方便。

希望能帮助到你。

     <extension module="org.wildfly.extension.picketlink"/>

    <subsystem xmlns="urn:jboss:domain:picketlink-federation:1.1">
        <federation name="my-federation">
            <key-store file="./keyStore.jks" relative-to="java.home" password="pass123" sign-key-alias="sp" sign-key-password="pass123">
                <keys>
                    <key name="idp" host="idpdomain.com"/>
                </keys>
            </key-store>
            <identity-provider name="anyname" url="url to the sso endpoint" external="true" encrypt="false" support-signatures="true" strict-post-binding="true" ssl-authentication="false" support-metadata="true"/>
            <service-providers>
                <service-provider name="myapp.war" security-domain="saml-realm" url="https://spdomain.com/myapp/" post-binding="true" support-signatures="true" support-metadata="true" strict-post-binding="true" logout-page="/logout.jsp">
                    <handlers>
                        <handler name="SAML2LogOutHandler" class-name="org.picketlink.identity.federation.web.handlers.saml2.SAML2LogOutHandler"/>
                        <handler name="SAML2AuthenticationHandler" class-name="org.picketlink.identity.federation.web.handlers.saml2.SAML2AuthenticationHandler">
                            <handler-parameter name="CLOCK_SKEW_MILIS" value="120000"/>
                            <handler-parameter name="NAMEID_FORMAT" value="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent"/>
                        </handler>
                        <handler name="RolesGenerationHandler" class-name="org.picketlink.identity.federation.web.handlers.saml2.RolesGenerationHandler"/>
                        <handler name="SAML2SignatureGenerationHandler" class-name="org.picketlink.identity.federation.web.handlers.saml2.SAML2SignatureGenerationHandler"/>
                        <handler name="SAML2SignatureValidationHandler" class-name="org.picketlink.identity.federation.web.handlers.saml2.SAML2SignatureValidationHandler"/>
                    </handlers>
                </service-provider>
            </service-providers>
        </federation>
    </subsystem>

    <security-domain name="saml-realm">
        <authentication>
            <login-module code="org.picketlink.identity.federation.bindings.jboss.auth.SAML2LoginModule" flag="required">
                <module-option name="password-stacking" value="useFirstPass"/>
            </login-module>
            <login-module code="org.jboss.security.auth.spi.RoleMappingLoginModule" flag="required">
                <module-option name="password-stacking" value="useFirstPass"/>
                <module-option name="rolesProperties" value="${jboss.server.config.dir}/rolesMapping-roles.properties"/>
                <module-option name="replaceRole" value="true"/>
            </login-module>
        </authentication>
        <audit>
            <provider-module code="org.picketlink.identity.federation.core.audit.PicketLinkAuditProvider"/>
        </audit>
    </security-domain>
于 2020-04-04T03:29:31.200 回答