加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

在Linux上使用C对Active Directory进行身份验证

发布时间:2020-12-14 02:14:16 所属栏目:Linux 来源:网络整理
导读:我很惊讶那里的例子很少.我基本上需要针对Active Directory进行用户/通过身份验证.我能够初始化到活动目录的连接,但它总是给我一个“无效的凭据”错误.我想知道我是不是错了.这是我第一次使用LDAP.就此而言,我对另一个(也许有很多文件记录)解决方案持开放态
我很惊讶那里的例子很少.我基本上需要针对Active Directory进行用户/通过身份验证.我能够初始化到活动目录的连接,但它总是给我一个“无效的凭据”错误.我想知道我是不是错了.这是我第一次使用LDAP.就此而言,我对另一个(也许有很多文件记录)解决方案持开放态度.

#include <iostream>
#include <stdio.h>

#define LDAP_SERVER "ldap://hq.mydomain.local/"

#include <ldap.h>

int main( int argc,char** argv )
{
    LDAP    *ld;
    int     version( LDAP_VERSION3 );
    int     rc;
    char    bind_dn[100];
    berval  creds;
    berval* serverCreds;

    if( ldap_initialize( &ld,LDAP_SERVER ) ) {
        std::cerr << "Error initializing ldap..." << std::endl;
        return 1;
    }

    ldap_set_option( ld,LDAP_OPT_PROTOCOL_VERSION,&version );

    creds.bv_val = "password";
    creds.bv_len = strlen("password");

    rc = ldap_sasl_bind_s( ld,"sAMAccountName=MYDOMAINUserName,dc=mydomain,dc=local","GSSAPI",&creds,NULL,&serverCreds );

    if ( rc != LDAP_SUCCESS ) {
        std::cerr << "ERROR: " << ldap_err2string( rc ) << std::endl; 
        return 1;
    } else {
        std::cout << "Success." << std::endl;
    }

    return 0;

}

编辑:

我想确保服务器端的一切正常,所以使用ldapsearch进行了一些测试.它起初没有用,但我终于得到了它(无论如何都是ldapsearch).

ldapsearch -D first.last@mydomain.local -H "ldap://hq.mydomain.local:389" -b "ou=Development,ou=Domain Users,dc=local" -W "sAMAccountName=first.last"

也许不是最好的方式.对于初学者,键是-D参数,并在结尾传递sAMAccountName.我不会有通用名称 – 只有Windows登录名和密码.如果密码通过,上面的命令将向用户显示他的信息.

警告(我认为)是ldap_sasl_bind_s()没有相当于设置-D(binddn)标志.看看this question/answer它看起来像ldap_interactive_bind_s()可能,但它涉及更多,因为我必须传回一个回调.

通过上面的例子,我设置了一个密码,但没有任何类型的binddn / username,是谁假设我正在尝试进行身份验证?

解决方法

sAMAccountName=MYDOMAINUserName,dc=local

这种用户名格式不正确.您不需要在用户名中指定sAMAccountName,也不需要指定dc,除非您使用的是专有名称.用户名很少.

>杰出的名字

CN=Jeff Smith,OU=Sales,DC=Fabrikam,DC=Com

> sAMaccountName

jsmith

>以前版本的Windows的用户路径

“Fabrikamjeffsmith”.

>用户主体名称(UPN)

jeffsmith@Fabrikam.com

话虽如此,我不确定用户名是否是您遇到的唯一问题.我没有在本地运行你的代码.

虽然这个答案可能无法直接回答你的问题,但由于我没有在Linux机器上测试过这段代码,它可以给你一个想法或让你朝着正确的方向前进.如果此方法仅适用于Windows,我不会感到惊讶.

根据MSDN,您可以使用几种方法来验证用户身份.

The 07001 function binds to an ADSI object using explicit user name and password credentials.

此方法接受以下参数:

HRESULT ADsOpenObject(
  _In_  LPCWSTR lpszPathName,_In_  LPCWSTR lpszUserName,_In_  LPCWSTR lpszPassword,_In_  DWORD   dwReserved,_In_  REFIID  riid,_Out_ VOID    **ppObject
);

使用此方法,您可以通过指定用户名和密码绑定到Active Directory中的对象.

如果绑定成功,返回码为S_OK,否则您将收到不同的错误消息.

我不会每天用C语言编写程序.我通常在C#世界中使用Active Directory和Active Directory轻量级服务.但是我编写的示例代码向您展示了如何使用指定的凭据调用ADsOpenObject方法绑定到ADSI对象.在您的情况下,只需进行身份验证.

#include <iostream>
#include "activeds.h"

using namespace std;

int main(int argc,char* argv[])
{
   HRESULT hr;
   IADsContainer *pCont;
   IDispatch *pDisp = NULL;
   IADs *pUser;

   CoInitialize(NULL);

   hr = ADsOpenObject( L"LDAP://yourserver",L"username",L"password",ADS_FAST_BIND,//authentication option     
               IID_IADs,(void**) &pUser);


   if (SUCCEEDED(hr))
   {
      cout << "Successfully authenticated";
   }
   else
      cout << "Incorrect username or password";
   return hr;
}

根据您的设置,您可能需要调整ADS_AUTHENTICATION_ENUM.我建议你安装SSL证书并使用ADS_USE_SSL绑定.在AD中处理没有SSL的密码可能是噩梦.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读