2015-04-23 93 views
23

我正在使用WSO2 Identity Server进行单点登录实现。自定义声明处理单点登录失败

在我的演示应用程序中,我试图从我自己的JDBC数据库中获取已验证用户的自定义声明属性。

我跟着这个Pushpalanka的blog

这工作得很好了在Identity Server 5.0.0

但是,当我更新的Identity Server与最新更新“WSO2-IS-5.0.0-SP01”,自定义理赔停止工作。

以下是错误堆栈:

[2015年4月22日19:09:43311] ERROR {org.wso2.carbon.identity.application.authentication.framework.handler.sequence.impl .DefaultStepBasedSequenceHandler} - 索赔处理失败! org.wso2.carbon.identity.application.authentication.framework.exception.FrameworkException: Index:0,Size:0 at com.wso2.sample.claim.handler.CustomClaimHandler.handleLocalClaims(CustomClaimHandler.java:200) at com.wso2.sample.claim.handler.CustomClaimHandler.handleClaimMappings(CustomClaimHandler.java:66) 在 org.wso2.carbon.identity.application.authentication.framework.handler.sequence.impl.DefaultStepBasedSequenceHandler.handleClaimMappings(DefaultStepBasedSequenceHandler。的java:604) 在 org.wso2.carbon.identity.application.authentication.framework.handler.sequence.impl.DefaultStepBasedSequenceHandler.handlePostAuthentication(DefaultStepBasedSequenceHandler.java:394) 在 org.wso2.carbon.identity.application.authentication.framework.handler.sequence.impl.DefaultStepBasedSequenceHandler.handle(DefaultStepBasedSequenceHandler.java:134) at org.wso2.carbon.identity.application.authentication.framework.handler。 request.impl.DefaultAuthenticationRequestHandler.handle(DefaultAuthenticationRequestHandler.java:121) 在 org.wso2.carbon.identity.application.authentication.framework.handler.request.impl.DefaultRequestCoordinator.handle(DefaultRequestCoordinator.java:94) 在 org.wso2.carbon.identity.application.authentication.framework.servlet.CommonAuthenticationServlet.doPost(CommonAuthenticationServlet.java:54) at javax.servlet.http.HttpServlet.service(HttpServlet.java:755)at javax.servlet。 http.HttpServle t.service(HttpServlet.java:848)at org.eclipse.equinox.http.helper.ContextPathServletAdaptor.service(ContextPathServletAdaptor.java:37) at org.eclipse.equinox.http.servlet.internal.ServletRegistration.service (ServletRegistration.java:61) 在 org.eclipse.equinox.http.servlet.internal.ProxyServlet.processAlias(ProxyServlet.java:128) 在 org.eclipse.equinox.http.servlet.internal.ProxyServlet.service (ProxyServlet.java:60) at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)at org.wso2.carbon.tomcat.ext.servlet.DelegationServlet.service(DelegationServlet.java:68) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:305) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 在 org.wso2.carbon.tomcat.ext.filter.CharacterSetFilter.doFilter(CharacterSetFilter。的java:61) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 在 有机.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 在 org.apache.catalina.authenticator.AuthenticatorBase .invoke(AuthenticatorBase.java:472) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 在 org.wso2.carbon.tomcat.ext.valves.CompositeValve.continueInvocation(CompositeValve.java:178) 在 org.wso2 .carbon.tomcat.ext.valves.CarbonTomcatValve $ 1.invoke(CarbonTomcatValve.java:47) 在 org.wso2.carbon.webapp.mgt.TenantLazyLoaderValve.invoke(TenantLazyLoaderValve.java:56) 在 org.wso2。 carbon.tomcat.ext.valves.TomcatValveContainer.invokeValves(TomcatValveContainer.java:47) 在 org.wso2.carbon.tomcat.ext.valves.CompositeValve.invoke(CompositeValve.java:141) 在 org.wso2。 carbon.tomcat.ext.valves.CarbonStuckThreadDetectionVa lve.invoke(CarbonStuckThreadDetectionValve.java:156) 在 org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936) 在 org.wso2.carbon.tomcat.ext.valves.CarbonContextCreatorValve.invoke( CarbonContextCreatorValve.java:52) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 在 org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004) at org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process(AbstractProtocol.java:589) 在 org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor.run(NioEndpoint.java:1653) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 在 的java.util .concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:745)导致: java.lang.IndexOutOfBoundsException:索引:0,大小:0 at java.util.ArrayList.rangeCheck(ArrayList.java:635)at java.util.ArrayList.get(ArrayList.java:411)at org.wso2.carbon.claim.mgt.ClaimManagerHandler.validateClaims(ClaimManagerHandler.java: 668) at org.wso2.carbon.claim.mgt.ClaimManagerHa ndler.getMappingsFromOtherDialectToCarbon(ClaimManagerHandler.java:529) 在 org.wso2.carbon.claim.mgt.ClaimManagerHandler.getMappingsMapFromOtherDialectToCarbon(ClaimManagerHandler.java:614) 在 com.wso2.sample.claim.handler.CustomClaimHandler.handleLocalClaims( CustomClaimHandler.java:141)。

根据我对Identity Server的源代码的研究这个问题在认证框架在org.wso2.identity.application.authentication.framewotk组件

问题可能出在验证声明上,但我没有在源代码中找到任何名为validateClaims的方法。

在博客文章中给出的源代码中,使用了认证框架版本 - 4.2.2

我试过使用最新版本的认证框架 - 4.2.3

但问题仍然在相同的组件。

我仍然在这方面付出努力。我需要一些指导。

如果我缺少一些东西或者您遇到同样的问题,请有人帮忙。

谢谢。

回答

0

即使在次要版本更新之间,我也会看到自定义模块的常见问题。即使现在我看到我们的自定义身份验证器可能无法工作在尚未发布的补丁之后。你真的需要定制索赔处理吗?

我们已将索赔和属性的索赔方言扩展到需要返回给服务提供者,并且默认框架实现将读取并用户/返回请求的用户属性。对于大多数情况下,它应该是足够的。

+0

是的 - 从额外的/额外的数据源读取用户属性并不总是很简单。我们创建了一个自定义用户管理器,用主LDAP进行身份验证,并从另一个源(AD)中读取属性,覆盖getUserPropertyValues方法。 – gusto2

+0

你说得对,用户角色需要分开处理。但是 - 我们试图保持简单并在用户商店层面上做到这一点(因为也有一些限制).. – gusto2

+1

是的,当我们从中获得声明的用户存储被配置时,这将是足够的作为身份服务器中的主要/次要服务器。 但是当我添加辅助用户商店时还有一些其他问题。例如ActiveDirectory。 当我将ActiveDirectory添加为辅助用户存储时,默认情况下,所有用户都没有获取内部/所有人角色。所以我们必须手动去用户并分配角色。这也适用于只有一个活动会话。 所以,最好是使用Custom声明处理程序,而不是将用户存储与Identity Server作为辅助用户存储。 –