使用 LDAP 和 Windows Active Directory 进行用户身份验证 (Windows Server 2016)

黑暗的悲伤

平台:Windows 10 x64 开发环境:MSVC 2017

Active Directory 平台:Windows Server 2016(评估)

我正在尝试验证位于使用 Windows Active Directory 维护的远程服务器上的 Windows 用户。我在本地 PC 上运行的服务给出了Invalid Credentials错误消息(即使在传递了正确的经过身份验证的用户名、密码和域之后)。

#include "pch.h"
#include <iostream>
#include <Windows.h>
#include <Winldap.h>
#include <plog/Log.h>
#include <string>

#ifdef UNICODE
typedef std::wstring        string_type;
#define CONSOLE_OUT         std::wcout
#define CONSOLE_IN          std::wcin
#define CONSOLE_ERR         std::wcerr
#else
typedef std::string         string_type;
#define CONSOLE_OUT         std::cout
#define CONSOLE_IN          std::cin
#define CONSOLE_ERR         std::cerr
#endif

int main()
{
    SEC_WINNT_AUTH_IDENTITY sec;
    string_type hostName = TEXT("192.168.1.49");
    string_type domain = TEXT("WIN-49MT1TDDGOC.darksorrow.com");
    string_type userName = TEXT("darksorrow\\ds");
    string_type password = TEXT("darksorrow@1234567890");
    PLDAP ld = nullptr;
    int ldapReturnCode;
    CONSOLE_OUT << TEXT("Hello World!\n");
    plog::init(plog::error, "error.dat", 1048576, 3); //1 M.B.
    ld = ldap_init(const_cast<PWSTR>(hostName.c_str()), LDAP_PORT);

    if (ld == nullptr)
    {
        LOG_ERROR << ldap_err2string(LdapGetLastError());
        CONSOLE_OUT << ldap_err2string(LdapGetLastError());
    }
    const int version = LDAP_VERSION3;
    ldapReturnCode = ldap_set_option(ld, LDAP_OPT_PROTOCOL_VERSION, std::addressof(version));
    if (ldapReturnCode not_eq LDAP_SUCCESS)
    {
        LOG_ERROR << ldap_err2string(ldapReturnCode);
        CONSOLE_OUT << ldap_err2string(ldapReturnCode);
    }
    ldapReturnCode = ldap_connect(ld, NULL);
    if (ldapReturnCode not_eq LDAP_SUCCESS)
    {
        LOG_ERROR << ldap_err2string(ldapReturnCode);
        CONSOLE_OUT << ldap_err2string(ldapReturnCode);
    }
    PWSTR   dn = nullptr;

    sec.Domain          = (unsigned short *) domain.data();
    sec.DomainLength    = domain.length();
    sec.User            = (unsigned short *) userName.data();
    sec.UserLength      = userName.length();
    sec.Password        = (unsigned short *) password.data();
    sec.PasswordLength  = password.length();
    sec.Flags           = SEC_WINNT_AUTH_IDENTITY_UNICODE;

    CONSOLE_OUT << domain << std::endl;
    CONSOLE_OUT << userName << std::endl;
    CONSOLE_OUT << password << std::endl;

    ldapReturnCode = ldap_bind_s(ld, dn, (PWCHAR)std::addressof(sec), LDAP_AUTH_NEGOTIATE);
    if (ldapReturnCode not_eq LDAP_SUCCESS)
    {
        LOG_ERROR << ldap_err2string(ldapReturnCode);
        CONSOLE_OUT << ldap_err2string(ldapReturnCode);
    }
    else
        CONSOLE_OUT << "Authentication Success\n";
    ldap_unbind(ld);
    return EXIT_SUCCESS;
}

我哪里错了?

加布里埃尔·卢奇

我决定自己尝试一下。事实证明,解决方案很简单。您的用户名不应包含域名。所以改变这个:

string_type userName = TEXT("darksorrow\\ds");

对此:

string_type userName = TEXT("ds");

您已经将域指定为单独的参数,因此不需要将其作为用户名的一部分。

您应该仍然可以使用LDAP_AUTH_NEGOTIATE.

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在没有Windows身份验证的情况下使用Active Directory用户在SQL SERVER 2008中进行身份验证

使用Active Directory和Windows身份验证在Blazor Server中赋予自定义角色

Active Directory身份验证和LDAP

如何使用Windows Active Directory身份验证和基于身份的声明?

在MVC 4中使用Windows身份验证获取Active Directory用户信息

使用Windows身份验证模拟MVC应用程序中的Active Directory用户

使用 Windows 身份验证登录 Azure Active Directory

Windows Server 2016 AD FS 4.0 使用 OAUTH JWT 和共享密钥对外部 Web 应用程序进行身份验证

通过网站上的私有IP LDAP / Active Directory进行用户身份验证

使用IAuthorizationFilter和Windows身份验证进行简单检查

使用 Django 和 Angular 进行 Windows 身份验证?

使用Active Directory进行身份验证和使用ASP.NET Identity进行角色

Django使用登录的Windows域用户进行身份验证

Windows Universal App的Active Directory身份验证库

使用用户名使用UnboundID对Active Directory用户进行身份验证

在 Windows 域中使用 python3 进行安全 LDAP 身份验证

使用WPF客户端和Active Directory ADFS对Cloud NodeJS后端进行身份验证

使用Azure Active Directory和Azure移动服务对PHP Web App进行身份验证

在本地和Azure上使用Active Directory进行身份验证

使用.NET Core Web API和React进行Active Directory身份验证

SQL Server Windows 用户身份验证

使用Azure Active Directory进行身份验证-如何以编程方式接受用户凭据

未使用长用户名对Active Directory / LDPA进行身份验证

使用Microsoft Active Directory进行LDAP配置

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

在Powershell上使用Azure Active Directory进行身份验证

使用 uid 进行 PHP 和 LDAP 登录身份验证

无法使用Django和ldap进行身份验证

使用Tomcat LDAP和PHP进行身份验证