2011-09-14 66 views
2

我已經編寫了一些C代碼來連接到Kerberized LDAP服務器。這一切都可以正常工作,但目前它每次連接時都會生成一個新的TGT,而不是在默認憑證緩存中使用該TGT(假設它已經存在)。檢查高速緩存中是否存在Kerberos票據

我已經研究過使用類似krb5_cc_resolve和krb5_initialize來獲取對緩存的引用,但是這似乎會破壞緩存(如果緩存已存在)以及它擁有的任何票據。

基本上,我想知道的是:是否有任何方法檢查現有TGT的默認憑證緩存而不破壞它?如文檔所述,

+0

正如文檔所述,'krb5_initialize'清除緩存。如果您想訪問現有的緩存,請不要這樣做 – jalf

回答

1

krb5_cc_initialize清除緩存。只是不這樣做,如果你想訪問現有的高速緩存

the docs

任何現有的憑據拋棄,緩存中的主體名稱設置爲值指定

0

查看kstart的代碼,它實現了-H選項。

http://git.eyrie.org/?p=kerberos/kstart.git;a=blob;f=framework.c;h=66e851413a9b4d71fa4d61ded2f3c0d71cd03b0c;hb=HEAD

基本上,你需要檢查的到期時間在機票校長。

/* Obtain the ticket. */ 
memset(&increds, 0, sizeof(increds)); 
code = krb5_cc_resolve(ctx, config->cache, &ccache); 
if (code != 0) 
    goto done; 
    increds.client = config->client; 
else { 
    code = krb5_cc_get_principal(ctx, ccache, &increds.client); 
    if (code != 0) 
     goto done; 
} 
code = get_krbtgt_princ(ctx, increds.client, &increds.server); 
if (code != 0) 
    goto done; 
code = krb5_get_credentials(ctx, 0, ccache, &increds, &outcreds); 
if (code != 0) 
    goto done; 
increds_valid = true; 

/* Check the expiration time and renewal limit. */ 
if (code == 0) { 
    now = time(NULL); 
    then = outcreds->times.endtime; 
    if (config->happy_ticket > 0) 
     offset = 60 * config->happy_ticket; 
    else 
     offset = 60 * config->keep_ticket + EXPIRE_FUDGE; 
    if (then < now + offset) 
     code = KRB5KRB_AP_ERR_TKT_EXPIRED; 
相關問題