2016-09-28 6 views
2

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の委任を結ぶことが可能かどうか疑問に思っていますか?

これについてのご意見はありがとうございます。

+0

こんにちは。あなたの質問を見つけてください。記録のために、ここではS4U2Proxyに関する関連する質問がありますhttps://stackoverflow.com/questions/31051468/using-java-8-s4u2proxy-a-good-example-neededしかし、あなたは正しい正当な委任が全く偽装を必要としない –

答えて

3

私は実際にこのようなことを最近行ってきましたが、春のセキュリティケルベロスを使用しています。私はgithubの例を入れましたhere。あなたが必要とするような制約付きの委譲を使用するように設定する必要があることが判明し、S4U2Proxyは、JAAS ConfigでisInitiator=trueを設定してgetDelegCredが呼び出されたとき(つまり、Oracle/OpenJDKを使用している場合) Krb5ProxyCredentialを返します。コメントhereを参照してください。その資格情報を使用して、thisのような通常の方法で使用するように制約されているサービスに対して、ユーザーの代わりにサービスチケットトークンを作成できます。

+0

ありがとう@tellisnz、まさに私が必要なもの! – Henrik

関連する問題