我有一個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委託綁定在一起?
非常感謝您對此的任何意見。
你好。只要找出你的問題。爲了記錄,這裏是關於S4U2Proxy的相關問題https://stackoverflow.com/questions/31051468/using-java-8-s4u2proxy-a-good-example-needed,但你是正確的代表團根本不需要冒充 –