当前位置: 首页 > 知识库问答 >
问题:

WSO2IS-5.3.0中OIDC SSO中缺少索赔

彭允晨
2023-03-14

我将WSO2IS-5.3.0用于带有自定义身份验证器和自定义声明处理程序的OIDC。

我的自定义身份验证器使用第三方web服务对用户进行身份验证,并在响应中获得一些声明。自定义声明处理程序将更多的声明从数据库添加到id_token中。因此SP接收到的id_token包含“来自服务的声明”+“来自数据库的声明”。

当我只有一个服务提供商(比如说SP1)时,一切都很好。我的问题从这里开始:

我添加了一个具有相同配置(具有相同的自定义身份验证器)的SP(作为OIDC),称为SP2。当用户在SP1中登录时,wso2返回带有所有声明的id_token,现在用户在其他选项卡中打开SP2并直接获得登录,而不需要进行身份验证(感谢SSO),但是....SP2仅从数据库(自定义声明处理程序)获取声明,而不获取自定义身份验证器返回的任何声明。WSO2的日志中没有错误。

所以基本上我的SSO根本不起作用。如果需要,我可以共享我的代码,但我认为这里的问题要么是一个bug要么是一些缺失的配置。你们知道吗????

更新:经过一个小POC后,我发现“自定义声明处理程序”正在为SP2再次调用,并重新计算声明。由于没有调用autheticator,因此来自第三方服务的声明为空。代码如下:

定义身份验证器:方法

context.setProperty("customclaim1", restResponse.customclaim1);
context.setProperty("customclaim2", restResponse.customclaim2);
context.setProperty("customclaim3", restResponse.customclaim3);

自定义声明处理程序:方法handleLocalClaims

claims.put("customclaim4", "databaseResponse.customclaim4");
claims.put("customclaim5", "databaseResponse.customclaim5");            
claims.put("customclaim1", (String) context.getProperty("customclaim1"));
claims.put("customclaim2", (String) context.getProperty("customclaim2"));
claims.put("customclaim3", (String) context.getProperty("customclaim3"));

对于SP2,由于未调用身份验证器,因此上下文中没有“CustomClaim1”、“CustomClaim2”和“CustomClaim3”的属性。因此SP2只接收“CustomClaim4”和“CustomClaim5”

知道怎么处理这种情况吗???

注意:authenticator中使用的rest服务不能更改,只有使用正确的用户名和密码调用时才会返回声明。

更新:基于以上观察,我还有一些问题:

>

  • 如果用户在WSO2中有活动会话,为什么会再次调用声明处理程序?

    WSO2是否将这些声明存储在数据库/缓存中?下一次在自定义声明处理程序中,我们可以使用数据库来获取声明吗??

    更新

    在尝试了Nilasini的解决方案后,我得到了这个错误:

    问题是,我没有使用任何userstore对用户进行身份验证。在我的自定义身份验证器中,我从登录页面获取用户名和密码,并调用第三方身份验证服务(添加了一些细节)。如何处理这个案子??

  • 共有1个答案

    易波涛
    2023-03-14

    是的,identity server正在从数据库[1]获取声明。您可以做什么来解决这个问题,创建一个自定义的本地声明,并映射到一个在您的用户存储中可用的属性。

    在完成上述步骤之后,通过您的自定义身份验证器为声明http://test.wso2.org/claims/customName分配值,如下所示。

    自定义身份验证器:方法

    userStoreManager.setUserClaimValue(username, "http://test.wso2.org/claims/customname",
                    restResponse.customclaim1, "default");
    

    然后,在您的自定义声明处理程序中,只添加您想从数据库响应中添加的声明。

    自定义声明处理程序:方法handleLocalClaims

    claims.put("keplerNumber", "databaseResponse.customclaim4");
    

    现在,如果您对两个服务提供者执行sso,两个服务提供者都将收到声明“KeplerNumber”和“CustomName”。

    您可以参考[2]和[3]使用两个OIDC应用程序测试此场景。按照[4]获得两个OIDC示例应用程序(playground2、playground3),然后使用两个示例应用程序执行SSO操作,为这两个应用程序调用userinfo。

    [1]https://github.com/wso2/carbon-identityframework/blob/master/components/authentication-framework/org.wso2.carbon.identity.application.authentication.framework/src/main/java/org/wso2/carbon/identity/application/authentication/framework/handler/claims/impl/defaultclaimhandler.java#L595

    [2]https://github.com/nilasini/custombasicauthenticator

    [3]https://github.com/nilasini/CustomClaimHandler

    [4]https://docs.wso2.com/display/is530/session+management+with+playground

     类似资料:
    • 我目前正尝试在我正在运行的WSO2IS5.3.0部署上使用secrets manager。打开配置后,我在启动WSO2时会出现以下错误 我相信这个提交https://github.com/wso2/carbon-kernel/commit/213bacaa7ecdd5a16ce1b73f8333c35ef136ce65(主要是最后一部分)已经解决了这个问题,所以我正在尝试替换我的org.wso2.

    • 我正在尝试自动化我的Wso2 5.3.0配置,以便根据我们的需要更容易地设置Wso2实例。 是否可以通过某个配置文件来配置服务提供程序,而不是通过管理面板来进行配置?

    • 我相信在我的应用程序中看到了一些标识声明的缓存,该应用程序使用WSO2IS5.3.0。当通过UserStoreManager.SetUserClaimValues(例如,http://wso2.org/claims/identity/AccountDisabled)更改标识声明时,该更改需要一些时间才能反映在随后对UserStoreManager.GetUserClaimValues的调用中 我搜

    • 我还在尝试将我的应用程序从WSO2IS-5.2.0迁移到WSOIS-5.3.0。我的应用程序是一个管理用户的rest api,我称之为wso2is soap WebServices。 在5.3.0中,我似乎不能用webservice修改identity/AccountLocked或identity/FailedLoginAttempts等标识声明 tid:1[2017-01-19 10:42:26

    • 我正在调用YouTube API,截至上周,它不再始终如一地在特定频道上查找最新发布的视频。 我正在使用文档中实际的“尝试这个API”窗口(这里有一个已经输入参数的链接): https://developers.google.com/youtube/v3/docs/search/list?apix_params={"part":"snippet "," channelId ":" uci8e 0

    • 问题内容: 我目前正在使用Java中的SQL。最近我收到此错误: 当我在连接字符串中添加参数时,会发生这种情况。该错误消息清楚地表明缺少sqljdbc_auth.dll,因此我尝试将dll放在与保留sqljdbc4.jar相同的路径中。 但是,这行不通,所以我想知道如何将这个dll添加到构建路径中?有特殊的方法吗? 问题答案: 好的,我发现了!我并不需要更改java.library.path,而是