2016-09-28 79 views
2

我有一個Java Web應用程序,它在Windows Active Directory環境中對客戶端執行SPNEGO身份驗證。 要驗證用戶,我們使用良好的舊SPNEGO SourceForge項目中的代碼。對後端服務的Java SPNEGO身份驗證和Kerberos約束委派(KCD)

String encodedAuthToken = (String) credentials; 
LOG.debug("Encoded auth token: " + encodedAuthToken); 
byte[] authToken = B64Code.decode(encodedAuthToken); 
GSSManager manager = GSSManager.getInstance(); 

try { 
    Oid krb5Oid = new Oid("1.3.6.1.5.5.2"); 
    GSSName gssName = manager.createName(_targetName, null); 
    GSSCredential serverCreds = manager.createCredential(gssName, GSSCredential.INDEFINITE_LIFETIME, krb5Oid, GSSCredential.INITIATE_AND_ACCEPT); 
    GSSContext gContext = manager.createContext(serverCreds); 

    if (gContext != null) { 
     while (!gContext.isEstablished()) { 
      authToken = gContext.acceptSecContext(authToken, 0, authToken.length); 
     } 
     if (gContext.isEstablished()) { 
      // Login succeeded! 
      String clientName = gContext.getSrcName().toString(); 
     } 
    } 
} 

認證工作很好,但是我們也有要求委派用戶憑據到後端服務(交易所EWS),使用約束委派。 在我們的AD中進行配置時,它看起來有點小差異,但事實並非如此。請參閱: AD delegation settings

的差異描述如下:msdn.microsoft.com/en-us/library/cc246080.aspx?f=255 & MSPPError = -2147217396 隨着不受約束的代表團,我們可以簡單地使用可用的委派憑據當我們調用後端服務,它都將是不錯的:

GSSCredential delegatedCreds = gContext.getDelegCred() 
SpnegoHttpURLConnection conn = new SpnegoHttpURLConnection(clientCreds); 

有了約束委派我們到用戶TGT沒有訪問,似乎我們需要使用MS-SFU(S4U2proxy)Kerberos擴展其Java 8假設支持。 我能找到的唯一的例子是這樣的一個:https://github.com/ymartin59/java-kerberos-sfudemo(感謝伊夫·馬丁這一點!)

現在我的問題......我的身份驗證後,我基本上結束了經過驗證的用戶的用戶名(見「客戶端名」在上面的代碼中)。

我們真的需要使用S4U2self機制來冒充用戶嗎? 客戶端剛剛發送給我們的是Kerberos服務票據(包裹在我無法解碼的SPNEGO令牌中)。 理想情況下,我們應該能夠使用該服務票據和我自己的服務的TGT來驗證用戶(使用S4U2proxy機制)? 但我不明白。

所以,現在我想知道是否有可能將我們的SPNEGO認證與S4U2proxy委託綁定在一起?

非常感謝您對此的任何意見。

+0

你好。只要找出你的問題。爲了記錄,這裏是關於S4U2Proxy的相關問題https://stackoverflow.com/questions/31051468/using-java-8-s4u2proxy-a-good-example-needed,但你是正確的代表團根本不需要冒充 –

回答

3

我最近一直在做這樣的事情,但我正在使用spring security kerberos。我在github here上舉了一個例子。關鍵是我發現我需要設置使用受限委派,就像你想要的那樣,S4U2Proxy是確保(如果你使用的是Oracle/OpenJDK),你在你的JAAS Config中設置了isInitiator=true,這樣當調用getDelegCred時,返回一個Krb5ProxyCredential。見評論here。使用該憑證,您可以使用它以代表用戶的方式爲您限制使用的服務以正常方式創建服務票證令牌,如this

+0

非常感謝@tellisnz,正是我需要的! – Henrik