【发布时间】:2012-01-12 11:52:07
【问题描述】:
我正在努力使用使用 MIT Kerberos 进行身份验证的 Windows 应用程序。
如果用户使用域用户帐户登录 Windows,klist 表明他从 AD 获得了预期的票证,包括这张票:
#1> Client: jalf @ TESTREALM.COM
Server: krbtgt/TESTREALM.COM @ TESTREALM.COM
KerbTicket Encryption Type: RSADSI RC4-HMAC(NT)
Ticket Flags 0x40e00000 -> forwardable renewable initial pre_authent
Start Time: 1/12/2012 9:46:27 (local)
End Time: 1/12/2012 19:46:27 (local)
Renew Time: 1/19/2012 9:46:27 (local)
Session Key Type: RSADSI RC4-HMAC(NT)
但是,当我们尝试在应用程序中使用此票证时,Kerberos 库似乎找不到那个票证。
以下是相关代码的简化版本:
// Open the MSLSA cache
krb5_cc_resolve(kcontext, "MSLSA:", &mslsa_ccache);
// Create a cursor for traversing the cache
krb5_cc_start_seq_get(kcontext, mslsa_ccache, &cursor);
// Check all the credentials in the cache
while (!(code = krb5_cc_next_cred(kcontext, mslsa_ccache, &cursor, &creds))) {
// Find the one with the INITIAL flag set
if ( creds.ticket_flags & TKT_FLG_INITIAL ) {
// ticket found
krb5_free_cred_contents(kcontext, &creds);
break;
}
krb5_free_cred_contents(kcontext, &creds);
}
krb5_cc_end_seq_get(kcontext, mslsa_ccache, &cursor);
但无论出于何种原因,我们从不输入// ticket found 部分。
在调试器中运行代码,我可以看到它找到了klist 显示的其他几张票,但由于某种原因,它始终找不到我们感兴趣的票。
谁能解释这种行为,或者如何解决它?天真地,我希望klist 的输出与使用krb5_cc_next_cred 遍历缓存的结果相匹配。
我对 Kerberos 比较陌生,并且从一位离职的同事那里继承了这段代码,所以我可能遗漏了一些重要的基本信息。
【问题讨论】:
标签: windows active-directory kerberos