keycloak - 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。
- 第 1 步:用户名表单 - 这会从用户那里收集用户名(并设置匹配的用户对象,我想)
- 第 2 步:自定义身份验证提供程序 - 这是我们自己的代码,它查看已解析的用户并进行 Web 服务调用以确定结果
然后我尝试在 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 中注册的用户,但如果不可能,我可以解决这个问题。(或者也许可以在浏览器绑定流程中创建新帐户?)
解决方案
推荐阅读
- numbers - 如何在laravel中拆分输入值并保存在没有字符的数据库中
- javascript - 有没有办法减少 React 项目的大小?
- android - 当我设置 minifyEnabled = true 时,应用程序无法使用 API
- c++ - 播放使用 FFMPEG 创建的分段 MP4 时出现问题
- java - 内在候选静态方法引用会在一段时间后消失?
- c# - 我如何用键设置一个布尔值并让它像一个开关
- javascript - 从承诺待处理的 JS 中获取价值
- ios - applescript:如何在多个窗口中执行击键
- python-3.x - 如何绘制具有数值的列与具有非数值的列?
- laravel - 将变量作为 Markdown 传递