我有一个 Java Web 应用程序,它在 Windows Active Directory 环境中对客户端进行 SPNEGO 身份验证。
为了验证用户身份,我们使用来自旧 SPNEGO SourceForge 项目的代码。
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();
}
}
}
身份验证效果很好,但我们还需要使用约束委派将用户凭据委派给后端服务 (Exchange EWS)。
在我们的 AD 中配置此功能时,看起来差别很小,但事实并非如此。看:AD 委派设置 https://i.stack.imgur.com/cDRsZ.png
此处描述了差异:msdn.microsoft.com/en-us/library/cc246080.aspx?f=255&MSPPError=-2147217396
通过无约束委派,我们可以在调用后端服务时简单地使用可用的委派凭据,这一切都很好:
GSSCredential delegatedCreds = gContext.getDelegCred()
SpnegoHttpURLConnection conn = new SpnegoHttpURLConnection(clientCreds);
通过约束委派,我们无法访问用户 TGT,看来我们需要使用 Java 8 应该支持的 MS-SFU (S4U2proxy) Kerberos 扩展。
我能找到的唯一例子是这个:https://github.com/ymartin59/java-kerberos-sfudemo https://github.com/ymartin59/java-kerberos-sfudemo(感谢伊夫·马丁!)
现在我的问题...在我的身份验证之后,我基本上最终得到了经过身份验证的用户的用户名(请参阅上面代码中的“clientName”)。
我们真的需要在这里使用S4U2self机制来模拟用户吗?
客户端刚刚向我们发送了 Kerberos 服务票证(包含在我无法解码的 SPNEGO 令牌中)。
理想情况下,我们应该能够使用该服务票证和我自己的服务的 TGT 来验证用户身份(使用 S4U2proxy 机制)?
但我不明白怎么办。
所以现在我想知道是否可以将我们的 SPNEGO 身份验证与 S4U2proxy 委托结合在一起?
非常感谢您对此的任何意见。