2012-07-16 181 views
0

我想配置Tomcat以便能夠連接到AD並相應地對用戶進行身份驗證。爲Tomcat配置Kerberos和模擬

另外,我還想使用客戶端憑證調用一些Web服務(在這種情況下爲Share Point)。

到目前爲止,我已成功配置Tomcat以使用SPNEGO身份驗證,如教程http://tomcat.apache.org/tomcat-7.0-doc/windows-auth-howto.html中所述。請注意,我使用了Tomcat的SPNEGO認證(不是Source Forge's或Waffle)。

我沒有使用Source Forge的實現,因爲我想保持簡單並使用Tomcat的開箱即用。另外,我希望Tomcat處理所有的身份驗證和授權,並使用SPNEGO作爲WEB.XML中的身份驗證方法和Tomcat的JNDI領域進行授權。

另外我還沒有使用WAFFLE,因爲這只是Windows。

我使用CXF作爲我的Web服務堆棧。據當時http://cxf.apache.org/docs/client-http-transport-including-ssl-support.html#ClientHTTPTransport%28includingSSLsupport%29-SpnegoAuthentication%28Kerberos%29了CXF文件,所有你需要做的Web服務進行身份驗證(在我的情況,共享點)是使用:

<conduit name="{http://example.com/}HelloWorldServicePort.http-conduit" 
    xmlns="http://cxf.apache.org/transports/http/configuration"> 
    <authorization> 
     <AuthorizationType>Negotiate</AuthorizationType> 
     <Authorization>CXFClient</Authorization> 
    </authorization> 
</conduit> 

和配置的Jaas.conf CXFClient(在我的情況,在Tomcat的服務器JAAS配置的位置,這樣我jass.conf樣子:

CXFClient { 
    com.sun.security.auth.module.Krb5LoginModule required client=true useTicketCache=true debug=true; 
}; 

com.sun.security.jgss.krb5.initiate { 
    com.sun.security.auth.module.Krb5LoginModule required 
    doNotPrompt=true 
    principal="HTTP/[email protected]" 
    useKeyTab=true 
    keyTab="C:/Program Files/Apache/apache-tomcat-7.0.27/conf/tomcatsrv.keytab" 
    storeKey=true 
    debug=true; 
}; 

com.sun.security.jgss.krb5.accept { 
    com.sun.security.auth.module.Krb5LoginModule required 
    doNotPrompt=true 
    principal="HTTP/[email protected]" 
    useKeyTab=true 
    keyTab="C:/Program Files/Apache/apache-tomcat-7.0.27/conf/tomcatsrv.keytab" 
    storeKey=true 
    debug=true; 
}; 

然而,當我調用Web服務,這是服務的用戶名下調用(在AD和配置即Tomcat的用戶名tomcatsrv.keytab),而不是客戶端的用戶名(如duncan.attard)。

所以我的問題是:是否有某種方式可以委託客戶的用戶名(或使用某種模擬)到CXF,以便當我調用Share Point的Web服務時(例如,我想使用Copy.asmx上傳文件),文件上傳爲duncan.attard而不是tomcat.srv

謝謝大家,非常感謝您的幫助。

回答

0

從技術上講,這是完美的。這裏是配方:

  1. 如果您使用憑證委託,則不需要登錄模塊名稱。
  2. 您必須確保用戶帳戶有資格進行委派。

看看Tomcat的GenericPrincipal的實現,它會爲你節省GSS證書(如果有的話)。將request.getPrincipal轉換爲GenericPrincipal並獲取憑證。

現在說你有憑據:

  1. 構造一個SubjectPrincipalGSSCredential作爲專用憑證。
  2. 將CXF代碼包裝成PrivilegedAction
  3. 將構建的主題和特權操作的實例傳遞給Subject.doAs方法,系統將代表傳遞的主題構造AccessControlContext,並將代表該上下文調用JAAS中的所有內容。如果正確實施,CXF應該使用那些。這在Unix上類似於susudo

最簡單的測試方法是在代表客戶端的特權操作中爲您的Active Directory創建InitialDirContext。這是我測試工作憑據委託環境的方式。