2012-11-29 42 views
4

所有,的Kerberos身份驗證與JAAS和多個領域

任何人能提供有關如何使用JAAS LoginContext將做一個認證對多個KDC /域組合建議。換句話說,如果嘗試1對領域A失敗,請嘗試領域B.

類似下面的僞代碼。

一如既往,非常感謝任何幫助。

view plaincopy to clipboardprint?

[realms] 
    some.address.for.auth.one 
    { 
    kdc = some.address.one 
    } 

    some.address.for.auth.two 
    { 
    kdc = some.address.two 
    } 

boolean loginSuccess = false; 

try 
{ 
    LoginContext lc = new LoginContext(...); 
    //Try Realm 1 
    lc.login(); 
    loginSuccess = true; 
} 
catch(LoginException le) 
{ 
    try 
    { 
    LoginContext lc2 = new LoginContext(...); 
    //Try Realm 2 
    lc2.login(); 
    loginSuccess = true; 
    } 
    catch(LoginException le) 
    { 
    //... 
    } 
} 

return loginSuccess; 
+0

你真的嘗試你的代碼? –

+0

你的意思是上面的僞代碼?不,但我跑了幾個變化。我可能不完全理解,但它看起來像krb插件使用System.setProperty(..),如果有兩個實例會破壞的東西,或者如果指向krb5.conf文件,它只會嘗試授權到默認領域。 –

+0

由於您的密鑰表綁定到一個領域,因此無法直接向多個領域進行身份驗證。你可以通過請求TGT來從你的領域中獲得不同的領域。所以不需要創建登錄上下文。 –

回答

0

這是可能的。例如,你可以在不同的文件中的每個配置,然後在每個開始嘗試通過Java的路徑krb5.ini和login.conf的文件:

boolean loginSuccess = false; 

try 
{ 
    System.setProperty("java.security.krb5.conf", "C:\kerb\conf1\krb5.ini"); 
    System.setProperty("java.security.auth.login.config", "C:\kerb\conf1\login.conf"); 
    // in login.conf you can have defined path to keytab for this configuration 

    LoginContext lc = new LoginContext(...); 
    //Try Realm 1 
    lc.login(); 
    loginSuccess = true; 
} 
catch(LoginException le) 
{ 
    try 
    { 
    System.setProperty("java.security.krb5.conf", "C:\kerb\conf2\krb5.ini"); 
    System.setProperty("java.security.auth.login.config", "C:\kerb\conf2\login.conf"); 
    // in login.conf you can have defined path to keytab for this configuration 

    LoginContext lc2 = new LoginContext(...); 
    //Try Realm 2 
    lc2.login(); 
    loginSuccess = true; 
    } 
    catch(LoginException le) 
    { 
    //... 
    } 
} 

return loginSuccess; 

這兩個系統屬性描述如下: http://docs.oracle.com/javase/7/docs/technotes/guides/security/jgss/tutorials/LoginConfigFile.htmlhttp://docs.oracle.com/javase/7/docs/technotes/guides/security/jgss/tutorials/KerberosReq.html

另一種可能性可能是沒有文件的配置。有一個LoginContext構造函數,它接受CallbackHandler(在這裏你傳遞用戶名和密碼)和Configuration(在這裏你傳遞你在login.conf中的參數)。 KDC和境界可以在系統屬性java.security.krb5.realm傳遞和java.security.krb5.kdc

http://docs.oracle.com/javase/8/docs/api/javax/security/auth/login/LoginContext.html#LoginContext-java.lang.String-javax.security.auth.Subject-javax.security.auth.callback.CallbackHandler-javax.security.auth.login.Configuration-