Windows Active Directory環境でクライアントのSPNEGO認証を行うJava Webアプリケーションがあります。 ユーザーを認証するには、古い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
私の認証後、基本的には認証されたユーザーのユーザー名で終わります(「clientName」を参照してください)上記のコードを参照)。
本当にここでユーザーを偽装するためにS4U2selfメカニズムを使用する必要がありますか? クライアントからKerberosサービスチケット(私がデコードできないSPNEGOトークンでラップされています)が送信されました。 理想的には、そのサービスチケットと私自身のサービスのTGTを使用して(S4U2proxyメカニズムを使用して)ユーザーを認証できるはずです。 しかし、私はどのように理解できません。
今私はSPUEGO認証とS4U2proxyの委任を結ぶことが可能かどうか疑問に思っていますか?
これについてのご意見はありがとうございます。
こんにちは。あなたの質問を見つけてください。記録のために、ここではS4U2Proxyに関する関連する質問がありますhttps://stackoverflow.com/questions/31051468/using-java-8-s4u2proxy-a-good-example-neededしかし、あなたは正しい正当な委任が全く偽装を必要としない –