首页 > 解决方案 > Keycloak SAML IDP 作为二级身份验证

问题描述

设想

在另一个工具通过 AD 进行身份验证后,我正在尝试 POC 一个 Keycloak 实现作为第二层身份验证。

App(SP) -> First IDP (step 1) -> AD 
           First IDP (step 2) -SAML-> Keycloak -> My Custom Authenticator

这个想法是,当第一个 IDP 调用 keycloak 进行身份验证(使用 SAML)时,他们将已经拥有用户的 id,并且 Keycloak 不需要再次要求用户输入他们的用户名。

什么是有效的

使用https://sptest.iamshowcase.com我可以向 Keycloak 发出 SAML 请求。

使用包含两个步骤的自定义身份验证流程,我可以进行身份​​验证并将 SAML 响应返回给 IAMShowcase。

然后我尝试在 iamshowcase 中使用自定义 saml 构建器来告诉 keycloak 用户名(电子邮件)。它创建了一个 saml 断言,如:

    <samlp:AuthnRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" 
        xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
        ID="UniqueNumberWeWillMakeUp"
        Version="2.0"
        IssueInstant="TheTimeYouPushTheButton"
        ProviderName="IAMShowcase"
        Destination="https://example.com/auth/realms/MYREALM/protocol/saml"
        ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
        AssertionConsumerServiceURL="https://sptest.iamshowcase.com/acs">
    <saml:Issuer>IAMShowcase</saml:Issuer>
    <saml:Subject>
        <saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">
            myuser@example.com
        </saml:NameID>
    </saml:Subject>
    <samlp:NameIDPolicy 
        Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified" 
        AllowCreate="true" />
    </samlp:AuthnRequest>

这神奇地在第一个身份验证流程步骤中用主题的电子邮件预先填充了用户名,我能够在不输入名称的情况下完成流程。

我认为用户根本不需要查看用户名表单。所以我尝试用Automatically Set Existing User步骤替换它,在测试时我收到了错误:

 Invalid username or password.

在日志中:

error=invalid_user_credentials

问题

如何从 SAML 断言中收集用户名,并在我的代码中使用它来解析我的自定义身份验证器而不提示用户输入用户名?

理想情况下,根本不需要在 Keycloak 中注册的用户,但如果不可能,我可以解决这个问题。(或者也许可以在浏览器绑定流程中创建新帐户?)

标签: keycloaksamlsaml-2.0idp

解决方案


推荐阅读