c++ - GSSAPI 获取用户名密码和构建凭证不适用于非登录用户

标签 c++ kerberos gssapi

我正在开发一个使用 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

最佳答案

好的,我明白了,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

以及某些上下文、凭证缓存和主体初始化部分。

关于c++ - GSSAPI 获取用户名密码和构建凭证不适用于非登录用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15519710/

相关文章:

c++ - strtok 并替换 C++ 中的子字符串

windows - 什么是kerberos?

c++ - 保护这份关于将 C/C++ 与 GSSAPI 和 SASL 结合使用的宝贵文档

ldap - Kerberos/SASSL/OpenLDAP : GSSAPI Error: Unspecified GSS failure.小代码可能会提供更多信息()

c++ - 如何获得 ComboBox 项目计数

c++ - 将lambda函数存储到std::function中有什么好处?

c++ - 没有匹配函数调用 "standard constructor"

hadoop - 远程HDFS文件从安全群集移动到非安全群集不起作用

powershell - 10 小时后长时间运行的 Exchange powershell 脚本中的 Kerberos 错误

c - 如何在使用客户端发送的 token 接受安全上下文之前获取用户名?