1

そのチケットを使用して別のバックエンドに対して認証するために、サーバー側でクライアント (リモート ユーザー) のサービス チケットを取得することは可能ですか?

シナリオ: ユーザー (IE) ==> AppServer (Linux 環境の Websphere) ==> バックエンド (Web サービス)

  • SPNEGO 認証が実行され、AppServer で動作しています
  • AppServer を実行する AD ユーザーには、委任を行う権限があります

前もって感謝します

=====================

アップデート

@ Michael-Oだから...これはステップバイステップである必要があります??

1) AppServer ユーザー (委任を行う権限を持つユーザー) にログインします。

2) 彼の名前で特権的な行動を実行する

3) このユーザーとリモート バックエンドの間のコンテキストを設定します

4) REMOTE USER SERVICE TICKET を使用した initSecContext

5) コンテキストの初期化の結果として、リモート ユーザーがリモート バックエンドにアクセスするためのサービス チケットが必要です。

private static String getToken(byte[] remoteUserServiceTicket) {
    String token = null;
    byte[] serviceTicket = null;
    try {

        krb5Oid = new Oid("1.2.840.113554.1.2.2");

        LoginContext loginCtx = new LoginContext("Krb5Login", new LoginCallbackHandler("APPSERVERUSER", "APPSERVERPASSWORD"));
        loginCtx.login();
        Subject subject = loginCtx.getSubject();
        serviceTicket = Subject.doAs(subject, new PrivilegedAction<byte[]>(){
            public byte[] run() {
                try {
                    byte[] delegatedTokenForTheRemoteUser = new byte[0];
                    GSSManager manager = GSSManager.getInstance();
                    GSSName webServerUserName = manager.createName("APPSERVERUSER@MYDOMAIN", GSSName.NT_USER_NAME);
                    GSSCredential webServerCred = manager.createCredential(webServerUserName, 8 * 3600, krb5Oid,
                        GSSCredential.INITIATE_ONLY);
                    GSSName backendName = manager.createName("HTTP/mybackend@MYDOMAIN", null);
                    GSSContext context = manager.createContext(backendName, krb5Oid, webServerCred,
                        GSSContext.DEFAULT_LIFETIME);
                    delegatedTokenForTheRemoteUser = context.initSecContext(remoteUserServiceTicket, 0, remoteUserServiceTicket.length);
                    return delegatedTokenForTheRemoteUser;

                } catch (GSSException e) {
                    e.printStackTrace();
                    return null;
                }
            }
        });
    } catch (Exception e) {
        //exception handling omitted
    }       

    token = Base64.encode(serviceTicket);
    return token;
}
4

0 に答える 0