我正在开发一个使用 WSO2 IS 5.10 的旧项目(目前尚未考虑迁移)
我正在尝试实现一个场景:
我使用支持 OIDC 的外部 IDP 作为身份验证源,但希望从共享相同 UserPrincipalName 的本地用户的配置文件中检索声明
为了实现这一目标,这就是我所做的:
USER1
下的 wso2 用户存储中创建了一个带有 upn
A
的用户。我在其默认配置文件中提供了一个电子邮件和一些角色A
下创建一个身份提供商 (WSO2IDP),该身份提供商连接到支持 OIDC 的联合身份提供商 (EXTIDP) 的服务提供商 (EXTSP)
Alias
(我怀疑它没有任何影响)和OpenID Connect User ID Location
(不确定它的作用)Additional Query Parameters
中的空格进行 urlEncode,因为 wso2 抛出了格式错误的 url 错误。A
(WSO2SP) 下的 WSO2 中创建了一个服务提供商,该服务提供商使用使用 WSO2IDP 的联合身份验证步骤。我要求 3 个本地强制索赔索赔配置:
http://wso2.org/claims/emailaddress
http://wso2.org/claims/role
http://wso2.org/claims/userprincipal
USER1
我的期望:
启动登录WSO2SP时,我被重定向到EXTSP登录屏幕。
我输入在步骤4中创建的用户的用户名和密码
我被重定向到我的 oauthCallbackUrl(在 WSO2SP 入站身份验证配置中配置),带有
code
。我可以将此代码交换到我的 WSO2SP 以获得:
id token
access token
refresh token
此时,我希望我的
id token
包含步骤 3 的强制声明,其中填充了在步骤 1中创建的用户
USER1
配置文件的值,但我总是收到一个错误页面,告诉我一些强制只读声明找不到。
我怀疑 wso2 很难将经过身份验证的用户从 EXTIDP 链接到我的本地用户,但我不知道从这里该去哪里。
额外信息:
我尝试了 WSO2IDP 中声明映射的多种变体,以将 sub 声明映射到本地声明 http://wso2.org/claims/userprincipal 但似乎没有任何效果。
我使用 authorization_code
grant 直接从
EXTSDP检索令牌,以确保所需信息(sub 声明)位于检索到的
id token
和 userinfo 端点中。它在两种情况下都存在。
我不知道需要哪些信息来解决这个问题,但如果您要求评论的精确性,我将很乐意满足。
您可以使用 WSO2 IS 的帐户链接功能将 EXTSDP 的联合身份与 WSO2 IS 中的现有本地身份链接。这可以使用自适应脚本来完成。当用户使用联合 IdP 进行身份验证时,自适应身份验证脚本可以从联合用户对象检索“sub”值,并搜索具有相同“UserPrincipalName”声明值的任何本地用户。然后您可以使用
doAssociationWithLocalUser(fedUser, localUsername, tenantDomain, userStoreDomain)
(https://is.docs.wso2.com/en/5.10.0/references/adaptive-authentication-js-api-reference/#doassociationwithlocaluserfeduser-localusername-tenantdomain-userstoredomain)自适应身份验证功能,将联合帐户与匹配的本地帐户链接起来。
媒体文章中解释的“场景 1” - https://medium.com/identity-beyond-borders/social-account-linking-with-wso2-identity-server-78b8a566e225解释了您的具体流程关注。