Java SPNEGO身份验证和Kerberos约束委派(KCD)到后端服务

我有一个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委托设置

此处描述了差异:msdn.microsoft.com/zh-

cn/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(感谢Yves Martin!)

现在解决我的问题…验证之后,我基本上得到的是验证用户的用户名(请参见上面的代码中的“ clientName”)。

我们真的需要在这里使用S4U2self机制来模拟用户吗?客户端刚刚向我们发送了Kerberos服务票证(包装在我无法解码的SPNEGO令牌中)。理想情况下,我们应该能够使用该服务票证和我自己的服务的TGT来验证用户身份(使用S4U2proxy机制)?但是我不知道如何。

因此,现在我想知道是否可以将我们的SPNEGO身份验证与S4U2proxy委托结合在一起?

非常感谢您对此的任何投入。

回答:

实际上,我最近一直在做这样的事情,但是我正在使用spring security kerberos。我把一个例子在github

这里。我发现需要进行设置以使用像您希望的那样的约束委派和S4U2Proxy的关键是要确保(如果您使用的是Oracle /

OpenJDK)isInitiator=true在JAAS

Config中进行设置,以便在调用getDelegCred时返回一个Krb5ProxyCredential。在这里查看评论。与凭证,你可以用它来对用户代表你被限制在正常的方式使用,如服务,创建服务票证令牌此。

以上是 Java SPNEGO身份验证和Kerberos约束委派(KCD)到后端服务 的全部内容, 来源链接: utcz.com/qa/408274.html

回到顶部