我正在开发一个使用GSSAPI登录服务器的C ++客户端。对于凭证我使用gss方法来构建凭证对象(在下面的代码中解释)。我的这部分代码是
#include <gssapi.h>
#include <gssapi_krb5.h>
#include <gssapi/gssapi_generic.h>
#include <gssapi/gssapi_ext.h>
gss_cred_id_t method_to_get_cred(){
char *username = "asanyal@DOMAIN.COM";
char *password = "correctpassword";
gss_buffer_desc send_tok;
OM_uint32 maj_stat, min_stat;
gss_cred_id_t cred;
gss_name_t gss_username;
gss_OID_set_desc mechs, *mechsp = GSS_C_NO_OID_SET;
gss_buffer_desc pwbuf;
send_tok.value = username;
send_tok.length = strlen(username);
maj_stat = gss_import_name(&min_stat, &send_tok,(
gss_OID) gss_nt_user_name,&gss_username);
if (maj_stat != GSS_S_COMPLETE) {
printf("parsing client name %d %d \n ", maj_stat, min_stat);
return -1;
}
printf("Maj stat after gss_import_name: %d \n", maj_stat);
printf("Acquired username \n");
//getting username complete
//getting password
pwbuf.value = password;
pwbuf.length = strlen(password);
maj_stat = gss_acquire_cred_with_password(&min_stat,
gss_username,
&pwbuf, 0,
mechsp, GSS_C_INITIATE,
&cred, NULL, NULL);
printf("Acquired password \n");
//getting password complete
printf("Maj stat and min stat after gss_acquire_cred_with_password: %d %d\n", maj_stat, min_stat);
return(cred);
}
现在我正在打印主要状态(gssapi级别状态)和次要状态(机制级别状态) - 在这种情况下是Kerberos。当我给登录用户(即asanyal)时,状态printf消息为两个值都给出0(一切顺利)
但是当我使用不同的用户名时(这个用户名在Active Directory中注册但我没有以他身份登录)我正在
majstat = 851968 and minstat = -1765328243
进一步调查显示,此次要状态消息对应于错误
KRB5_CC_NOTFOUND Matching credential not found
我确定我正在为未登录的用户传递正确的凭据(用户名密码)
这是内部的GSSAPI有问题吗(也许它无法获得机票或其他东西)或者我是否犯了一些错误?
使用的配置:Windows Active Directory(Windows Server 2008)和MIT kerberos库 - 版本4.0.1
答案 0 :(得分:2)
好的我明白了,GSS-API不包含任何直接获取TGT,ST的API调用。为此你需要krb api(在基础kerberos机制的情况下)。通常,您需要一个类似的功能: -
krb5_get_init_creds_password(context,&creds,principal,conn->passwd,NULL,NULL,NULL,NULL,opts)) //these are the arguments i specified in my program
以及某些上下文,凭证缓存和主要初始化部分。