2015-04-23 65 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作爲輔助用戶存儲。 –