【发布时间】:2018-08-07 20:52:45
【问题描述】:
我将 WSO2is-5.3.0 用于具有自定义身份验证器和自定义声明处理程序的 OIDC。
我的自定义身份验证器使用第三方网络服务对用户进行身份验证,并在响应中获得一些声明。自定义声明处理程序将更多声明从数据库添加到 id_token。所以 SP 收到的 id_token 有“来自服务的声明”+“来自数据库的声明”。
当我只有一个服务提供商(比如说 SP1)时,一切都很好。我的问题从这里开始:
我又添加了一个名为 SP2 的具有相同配置(具有相同自定义身份验证器)的 SP(作为 OIDC)。当用户在 SP1 中登录时,WSO2IS 返回带有所有声明的 id_token,现在用户在其他选项卡中打开 SP2 并直接登录而不被要求进行身份验证(感谢 SSO)但是.... SP2 只获得来自数据库的声明(来自自定义声明处理程序) 并且 不会 获得从自定义身份验证器返回的任何声明。 WSO2 的日志中没有错误。
所以基本上我的 SSO 根本不起作用。如果需要,我可以分享我的代码,但我认为这里的问题要么是错误,要么是缺少一些配置。有什么想法吗????
更新: 经过一点 POC,我发现再次为 SP2 调用“自定义索赔处理程序”并重新计算索赔。由于未调用身份验证器,因此来自第三方服务的声明为空。以下是代码:
自定义身份验证器: 方法processAuthenticationResponse
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 的解决方案后,我得到了这个错误:
问题是,我没有使用任何用户存储来验证用户。在我的自定义身份验证器中,我从登录页面获取用户名和密码并调用第三方身份验证服务(带有一些附加细节)。这种情况怎么处理??
【问题讨论】:
标签: wso2 wso2is openid-connect