我们使用Keycloak 12.02进行测试。
这个想法是我们有很多客户,我们都在自己的领域中拥有。我们希望能够为主领域中的管理员/支持用户模拟任何非主领域中的用户。
流程将是:
这是我无法上班的最后一步。
登录大师领域
token=$(curl -s -d 'client_id=security-admin-console'
-d 'username=my-super-user' -d 'password=my-super-pass' \
-d 'grant_type=password' \
'https://login.example.net/auth/realms/master/protocol/openid-connect/token' | jq -r .access_token)
(我们现在有一个主领域超级用户的访问令牌)
KeyCloak服务器已启用令牌交换(-Dkeycloak.profile.feature.token_exchange=启用),如下所述https://www.keycloak.org/docs/latest/securing_apps/#_token-exchange.
尝试模拟另一个领域(非主领域)中的用户:
curl -s -X POST "https://login.example.net/auth/realms/some_realm/protocol/openid-connect/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
--data-urlencode "grant_type=urn:ietf:params:oauth:grant-type:token-exchange" \
-d 'client_id=some_client' \
-d "requested_subject=some_user" \
-d "subject_token=$token"
然而,这并不奏效。结果是:< code>{"error":"invalid_token "," error _ description ":" Invalid token " }
(在单个领域内完成这项工作)
我做错了什么?这似乎是在实际部署中使用的一个非常正常的功能,因此非常感谢您的帮助!
更新:首先,我在这里发现了非常相同的用例:https://lists.jboss.org/pipermail/keycloak-user/2019-March/017483.html
此外,我可以通过一些主要的工作来实现它。如上所述,可以使用主
领域中的代理
客户端作为身份提供者:
A
-上面的警告是,用户< code>adminA是在您使用这种方法登录的每个领域中创建的,所以仍然不理想。
据我所知,你所描述的是不可能的。我想知道一年多后你在哪里...你解决了你的问题吗?
在继续之前,请注意,我发现奇洛克话语是一个很好的奇洛克问题论坛:https://keycloak.discourse.group/
第二,这就是我所理解的:对于密钥斗篷,两个领域或两个不同的密钥斗篷是相同的。没有什么共同之处,它们是两个完全不同的id提供者。因此,任何假设领域间共享信任或共享用户的推理都不会奏效。
要登录到其他领域,您需要一个受信任的令牌。其他领域没有理由信任主领域。设置信任的方法是将主领域客户端设置为另一领域的身份提供者(我知道这是您不想做的),这样由主领域签名的令牌将被另一领域信任。
设置好之后,除了让令牌交换在另一个领域中创建一个联合“admin”用户(我将它配置为每次都从头开始创建,以避免任何同步),我还没有看到任何其他交换方式。此外,为了创建最终的JWT,还将用到两个映射,一个是ID提供者映射,一个是客户端映射。
如果这与你的发现不符,请纠正我。
啊,是的:还有使用OAuth中定义的令牌交换的问题,以及may_act声明,这在这里是完美的。但它将在两个领域之间的交换之后出现。看见https://datatracker.ietf.org/doc/html/rfc8693#section-4.4
编辑:“每次从头开始创建用户”
转到“身份提供者”/ /“设置”选择“同步模式”以“强制”这是工具提示中的相关摘录:
同步模式决定何时使用映射器同步用户数据。可能的值为:“传统”以保持引入此选项之前的行为,“导入”以在用户首次登录此身份提供者时仅导入用户一次,“强制”以在每次登录此身份提供者时始终更新用户。
所以当你选择“强制”时,基本上用户将在每次登录时被覆盖。好吧,所以这不是一个真正的创作,但尽可能接近你:-)这里的想法是不关心它,这对于原型设计来说很好。但我想在生产中,你可能想要优化它。
嗨,KeyClope开发人员和大师们, 我想设置KeyClope,使用openid连接2个领域 其中 Realm1 将包含客户端应用程序 而 realm2 包含用户 然后,用户将通过 realm2 进行身份验证来访问 realm1 中的客户端应用程序。 我发现这个链接——
问题内容: 我是快速入门的新手。我想做一个复合主键,当我尝试这样的事情时: 我收到此错误:对象’DbLocation’上不存在’主键属性’uuid’ 任何人都可以通过示例为我提供帮助,该示例如何创建复合主键? 问题答案: 对于领域: 用法示例: 当然,你可以玩弄各种使用上的听众和,以确保compoundKey才能正确重写每一个值换衣服的时间。 对于领域: 自定义设置器确保compoundKey始终
我目前正在使用Aptana Studio3.6.1(一个带有一些PHP语法修复的自定义构建)。我使用SFTP将文件从我的项目上传到一个测试站点,使用发布工具(项目顶部的上传/下载箭头)。 最近,我变得无法上传文件。WinSCP可以很好地执行这些操作,并且我可以在使用PuTTY或普通旧OpenSSH时将SSH插入服务器而没有问题。然而,Aptana却大发雷霆: auth.log(带有LogLevel
我正在升级一个平台上的安全。但是,我无法破解如何安全地存储我的加密/解密密钥。 当前安装程序: MySQL Server Webserver 我需要使用aes_encrypt/aes_decrypt存储和读取数据库中的所有敏感数据。但是,加密/解密数据的密钥我想要安全地存储。因此,当某人获得数据库或Web服务器的访问权时,他们将无法轻易猜出组合键或从配置文件中读取组合键。 密钥可以根据我需要读/写
问题内容: 我有一个结构非常大的JSON对象,如下所示: 我需要一个可以与对象中的键交换值的函数,但我不知道该怎么做。我需要这样的输出: 有什么办法可以手动创建一个新对象,其中所有内容都可以交换? 谢谢 问题答案: 这里的示例FIDDLE不要忘记打开控制台以查看结果。 ES6 版本: 或使用Array.reduce()和Object.keys() 或使用Array.reduce()和Object.
如何使用嵌入式iframe方法解决跨域问题?意思是我有域A和域B,并想在域B上嵌入域A,以绕过同源策略?一个详细的例子将是伟大的!