升级WSO2 IS 5.11.0后,部分SP注册提示‘Invalid tenant domain: null’求助
问题背景
升级至WSO2 Identity Server 5.11.0后,从部分SAML服务提供商(如Shibboleth v3、ServiceNow类型SP)跳转至登录页点击「创建账户」,提交注册表单时出现Invalid tenant domain: null错误,但直接从/myaccount入口注册正常。5.9.0版本无此问题,已启用「email as username」功能,修改JSP添加租户域未解决。
场景差异分析
- 正常场景(OIDC SP、travelocity SAML SP):注册请求URL中
tenantDomain为独立参数,callback参数完整,注册流程无异常。 - 失败场景(Shibboleth v3、ServiceNow SAML SP):注册请求URL包含
RelayState、SigAlg、Signature等带特殊字符的参数,页面渲染时callback隐藏字段值变为null,导致后续流程无法获取tenantDomain。
原因定位
WSO2 IS 5.11.0的accountrecoveryendpoint在处理包含特殊字符(如签名中的+、/、=)的callback参数时,URL解码或参数解析逻辑存在缺陷,导致callback值被错误设置为null,进而丢失其中携带的tenantDomain信息。
解决办法
1. 临时前端修复(修改注册页面JSP)
找到<IS_HOME>/repository/deployment/server/webapps/accountrecoveryendpoint/register.jsp文件,修改callback隐藏字段的渲染逻辑:
<% String callback = request.getParameter("callback"); String tenantDomain = request.getParameter("tenantDomain"); String sessionDataKey = request.getParameter("sessionDataKey"); // 处理callback为null的情况,手动构建包含tenantDomain的基础callback if (callback == null || "null".equals(callback)) { callback = request.getContextPath() + "/authenticationendpoint/login.do?tenantDomain=" + tenantDomain; if (sessionDataKey != null) { callback += "&sessionDataKey=" + sessionDataKey; } } %> <input id="callback" name="callback" type="hidden" value="<%= callback %>" class="form-control required usrName usrNameLength" required="">
修改后重启WSO2 IS服务,测试注册流程。
2. 后端代码修复(优化参数解析逻辑)
找到RegisterAction.java(位于org.wso2.carbon.identity.account.suspension.endpoint.action包下),优化callback参数的获取与解码逻辑:
import java.net.URLDecoder; import java.nio.charset.StandardCharsets; // 在处理请求参数的方法中添加如下逻辑 String callback = request.getParameter("callback"); String tenantDomain = request.getParameter("tenantDomain"); String sessionDataKey = request.getParameter("sessionDataKey"); if (callback != null) { try { // 正确解码包含特殊字符的callback参数 callback = URLDecoder.decode(callback, StandardCharsets.UTF_8.name()); } catch (Exception e) { // 异常处理,可记录日志 } } else { // 构建默认callback,确保tenantDomain存在 callback = request.getContextPath() + "/authenticationendpoint/login.do?tenantDomain=" + tenantDomain; if (sessionDataKey != null) { callback += "&sessionDataKey=" + sessionDataKey; } }
重新编译该类并部署到<IS_HOME>/repository/components/dropins目录,重启服务。
3. 官方补丁安装
检查WSO2官方支持门户或GitHub Issues,搜索是否有针对该问题的官方补丁,若存在则直接下载安装补丁包,按照官方文档完成配置。
验证
修改完成后,从Shibboleth v3或ServiceNow类型SP跳转至注册页面,提交表单后不再出现Invalid tenant domain: null错误,注册成功后可正常跳转回对应服务提供商。
内容的提问来源于stack exchange,提问作者Robert Dumbrava

