2011-09-14 32 views
2

Kerberos LDAPサーバーに接続するためのCコードを記述しました。これはうまくいきますが、現時点では、現時点では、接続するたびに新しいTGTを生成します。既存の資格証明キャッシュに既存のTGTを使用するのではなく、新しいTGTを生成します。キャッシュにKerberosチケットが存在するかどうかの確認

krb5_cc_resolveとkrb5_initializeのようなものを使用してキャッシュへの参照を調べましたが、キャッシュが既に存在する場合は、それが保持するチケットとともにキャッシュを破壊するようです。

基本的に、私が知りたいのは、既存のTGTを破棄せずにデフォルトのクレデンシャルキャッシュをチェックする方法はありますか?

+0

「krb5_initialize」はドキュメントに記載されているように、キャッシュをクリアします。既存のキャッシュにアクセスするには – jalf

答えて

1

krb5_cc_initializeは、ドキュメントに記載されているとおり、キャッシュをクリアします。ちょうどあなたがthe docsから既存のキャッシュ

にアクセスしたい場合があることを行うません。

既存の資格情報が破棄され、キャッシュのプリンシパル名が値に設定され、指定

0

-hオプションを実装するkstartのコードを見てください。

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; 
関連する問題