Использование встроенной аутентификации IIS AD с помощью PHP CGI под IdentityPool - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть веб-сайт PHP, работающий как приложение на IIS.

Приложение использует специальную идентификацию, которая запускает все процессы php-cgi.exe под пользователем NetworkService, который имеет доступ к серверу AD.

В IIS есть еще одно приложение .NET, где оно использует ту же идентификационную информацию и может входить в AD, используя класс System.Web.Security.FormsAuthentication, и использует Forms Authentication в настройках аутентификации в IIS.Я попытался скопировать настройки заново, но безрезультатно.

Код .NET:

...
using System.Web.Security.Membership.ValidateUser;
...

public ActionResult Login(Login model, string route)
{
    if (Membership.ValidateUser(model.Username, model.Password)) {
        FormsAuthentication.SetAuthCookie(model.Username);
        return Redirect(route);
    }

    return RedirectHome();
}

Мой код, работающий на IIS с PHP CGI, олицетворение включено на уровне IIS и php.iniуровень:

public function login()
{
    $ldapHost = 'ldap://spacemudd-ad';

    // PHP should use server's (iis) credentials when connecting. (impersonate)
    $connection = ldap_connect($ldapHost);

    // This always fails.
    //
    // "ldap_bind(): Unable to bind to server: Can't contact LDAP server"
    //
    // I believe due to the php-cgi.exe not sending the request
    // to the AD server through the IdentityPool's user (NetworkService)
    // even though in the TaskManager, the php-cgi.exe shows the owner is
    // NetworkService?
    //
    $ldapBind = ldap_bind($connection);

    // TODO: Search the AD directory for the user to be authenticated.
}

php.ini конфигурация:

fastcgi.impersonate = 1

ref.вопросы:


Обновление 24-11-2018 : Системный администратор дал мне следующую информацию:

config.md:

 <add name="ADConnectionString" connectionString="LDAP://spacelantern-central/DC=spacelantern,DC=com" />

    <membership defaultProvider="ADMembershipProvider">
      <providers>
        <clear />
        <add name="ADMembershipProvider" type="System.Web.Security.ActiveDirectoryMembershipProvider" connectionStringName="ADConnectionString" attributeMapUsername="sAMAccountName" />
      </providers>
    </membership>

code.md:

if (Membership.ValidateUser("userid", "password"))
{
    // 
}

1 Ответ

0 голосов
/ 20 ноября 2018

Подозреваю, у вас две проблемы.Во-первых, это:

ldap_set_option($connection, LDAP_OPT_PROTOCOL_VERSION, $ldapPort);

Какое значение в $ldapPort?Название этой переменной предполагает, что она содержит порт TCP для подключения, но это не то, для чего LDAP_OPT_PROTOCOL_VERSION предназначен.

LDAP_OPT_PROTOCOL_VERSION для версии LDAP, используемой для связи.Для AD вы можете установить его на 3, так как AD поддерживает LDAPv3:

ldap_set_option($connection, LDAP_OPT_PROTOCOL_VERSION, 3);

Во-вторых, если вам нужно подключиться к порту, отличному от порта по умолчанию (389), вам нужно передать егов звонилке ldap_connect:

$connection = @ldap_connect($ldapHost, $ldapPort);
...