2011-05-05 91 views
2

我正在編寫需要從IIS託管的Web服務中獲取數據的Java 1.5+客戶端。我在Eclipse中創建了一個新的Web服務客戶端,並在生成客戶端代理時使用Java代理客戶端類型和Apache Axis2 Web服務運行時。 Web服務本身在Windows 2003上運行,並且安全性設置爲僅使用Windows集成身份驗證。我在網上發現了很多文章,展示瞭如何從Java客戶端成功連接到這個IIS服務,但是我看到的所有東西似乎都要求我將用戶名和密碼放在我的Java客戶端代碼中。Java客戶端調用Windows集成身份驗證Web服務

我的Java客戶端將運行在IIS服務所在的同一Active Directory網絡上的Windows計算機上(即,我每天登錄的帳戶都可以訪問該服務)。我想讓我的Java客戶端在登錄用戶的上下文中運行,而不需要在代碼中輸入我的登錄憑據。這裏是我當前的代碼,它的工作原理,但我需要在代碼中把一個用戶名和密碼:

final NTCredentials nt = new NTCredentials("my_username", "my_password", "", "my_domain"); 
     final CredentialsProvider myCredentialsProvider = new CredentialsProvider() { 
      public Credentials getCredentials(final AuthScheme scheme, final String host, int port, boolean proxy) throws CredentialsNotAvailableException { 
       return nt; 
      } 
     }; 

     DefaultHttpParams.getDefaultParams().setParameter("http.authentication.credential-provider", myCredentialsProvider); 

但我真的不希望有把用戶名和密碼的代碼 - 我希望它使用正在運行Java客戶端的已登錄Windows用戶的憑據運行。

我應該使用哪些代碼,以便與登錄用戶的憑證連接,而無需指定用戶名和密碼?這可能嗎?

+0

肖恩 - Axis2的不(我相信)直接包括HTTP客戶端代碼。自從我使用Axis以來,這已經有一段時間了,但此時它需要Apache httpclient 3。您能確認您是否在使用Axis2和HTTPClient 3? – 2011-05-11 17:35:48

+0

我還沒有做任何具體的查看或使用HTTPClient3。我所做的是1)右擊該項目,並創建一個新的Web服務客戶端: 一個。 \t右鍵 - 新建 - 其他 - Web服務 - Web服務客戶端 灣\t點擊下一步 c。 \t指向Web服務的WSDL d。 \t將儀表設置到最低級別(開發客戶端) e。 \t單擊Web服務運行時的配置鏈接 - 選擇Apache Axis2 f。 \t完成 2)使用生成的代理類來使用服務 – Shawn 2011-05-19 22:02:23

回答

-2

您所描述的功能不是OS的功能,而是Internet Explorer的功能。您應該可以更好地瞭解「Windows身份驗證」的實際工作原理(又名NLTM HTTP身份驗證)。 JCIFS正在移除向servlet容器提供此功能的ServletFilter。但是,他們的basic description of how NTLM HTTP Authentication works是有幫助的。

一旦您瞭解了身份驗證的工作方式,您就可以實現某種Axis插件來提供該功能。

2

我已經使用了Axis已經有幾年了 - 然後,Axis依賴於Apache commons httpclient 3.從閱讀一些郵件列表,它看起來像this is still the case。 (如果沒有,最後一段應該提供一些值得歡迎的幫助。)

Apache commons httpclient 3不支持通過HTTP進行「集成Windows身份驗證」(即與Kerberos的協商身份驗證機制,又名「SPNEGO」。)實際上,它不支持NTLMv2,僅支持NTLMv1,這意味着您將無法對許多需要NTLMv2而無需修改的IIS服務器進行身份驗證。

儘管無可厚非,但我認爲最好的選擇是創建一個新的AuthScheme,它調用Windows SSPI庫進行身份驗證。不幸的是,你需要使用JNI來做到這一點。幸運的是,AuthScheme已準備好執行基於會話的質詢 - 響應身份驗證模式(SPNEGO與已支持的NTLM類似)。基本上,您將base64編碼輸入和輸出字節緩衝區爲本地InitializeSecurityContext調用。我承認編寫這個程序很繁瑣,但我可以確認它確實可以讓您對IIS服務器執行集成Windows身份驗證。

(不幸的是,如果你需要你的客戶是跨平臺的,你還需要編寫Unix上的必要GSSAPI代碼。)

另一種方法是編寫使用Java的Kerberos庫新AuthScheme (JAAS)。我不太瞭解這些,說實話,因爲它需要從系統kerberos庫中單獨配置。也就是說,在Windows上,您必須編寫一些指向您的Active Directory服務器的Kerberos配置文件。在我看來,這並不是真正的「整合」。如果您將軟件分發給客戶,而且他們希望「只是工作」,這可能不適合您。另外,雖然JAAS已經有一段時間了,我相信,早期版本缺乏的是被要求談談對Active Directory一些身份驗證機制,所以我想你會需要一個Java 6的運行時間。現在

,如果我錯了,你可以使用Axis2的新的Apache HTTP組件HttpClient的4,那麼你就好得多。 httpclient 4使用Java的Kerberos庫支持SPNEGO,這意味着一旦您不必編寫自己的AuthScheme,只需配置C:\ WINDOWS \ KRB5.INI,並且您應該能夠利用集成Windows身份驗證。但是,爲了避免必須配置JAAS的手動步驟,您仍然需要調用本地SSPI方法。

相關問題