Как проверить учетные данные домена (из нативного кода )?

я хочу проверить набор учетных данных на контроллере домена. например:

Username: joel
Password: splotchy
Domain:   STACKOVERFLOW

В .NET 3.5 и новее вы можете использовать PrincipalContext.ValidateCredentials(username, password).

Иначе у вас будут проблемы.

Следуя коду из статьи базы знаний Microsoft Как проверить учетные данные пользователя в операционных системах Microsoft, я дошел до того, что вы вызываетеAcceptSecurityContext:

ss = AcceptSecurityContext(
      @pAS._hcred,           //[in]CredHandle structure
      phContext,             //[in,out]CtxtHandle structure
      @InBuffDesc,           //[in]SecBufferDesc structure 
      0,                     //[in]context requirement flags
      SECURITY_NATIVE_DREP,  //[in]target data representation
      @pAS._hctxt,           //[in,out]CtxtHandle strcture
      @OutBuffDesc,          //[in,out]SecBufferDesc structure
      ContextAttributes,     //[out]Context attribute flags
      @Lifetime);            //[out]Timestamp struture

за исключением того, что функция завершается с ошибкой:

SEC_E_NO_AUTHENTICATING_AUTHORITY(0x80090311)

Ошибка функции. Не удалось связаться ни с одним органом для аутентификации. Это может быть связано со следующими условиями:

  • Неверное доменное имя аутентифицирующей стороны.
  • Домен недоступен.
  • Не удалось установить доверительные отношения.

Это была бы полезная ошибка, за исключением того, что я могу проверить те же учетные данные из .NET 3.5, используя:

using (PrincipalContext context = new PrincipalContext(ContextType.Domain, domain))
{
    valid = context.ValidateCredentials(username, password);                
}

Что может происходить, что позволяет .NET для проверки набора учетных данных, а собственный код не может?


Обновление: LogonUserтакже завершается ошибкой:

LogonUser("joel@stackoverflow.com", null, "splotchy", 
      LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_WINNT50, out token);

с

1311 - There are currently no logon servers available to service the logon request

обновлением 2: я пробовал как предпочитаемого Negotiate, так и устаревший поставщик Windows NT4 «NTLM»

String package = "Negotiate"; //"NTLM"

QuerySecurityPackageInfo(package, [out] packageInfo);
...
AcquireCredentialsHandle(
      null,                 //[in] principle
      package,              //[in] package
      SECPKG_CRED_OUTBOUND, //[in] credential use
      null,                 //[in] LogonID
      pAuthIdentity,        //[in] authData
      null,                 //[in] GetKeyFn, not used and should be null
      null,                 //[in] GetKeyArgument, not used and should be null
      credHandle,           //[out] CredHandle structure
      expires);             //[out] expiration TimeStamp structure

7
задан Community 23 May 2017 в 12:22
поделиться