Аутентификация на основе форм PHP в Windows с использованием локальных учетных записей пользователей

Я использую PHP, Apache и Windows. У меня нет настройки домена, поэтому я хотел бы, чтобы аутентификация на основе форм моего веб-сайта использовала локальную базу данных учетных записей пользователей, встроенную в Windows (я думаю, она называется SAM).

Я знаю, что если Active Directory настроен, вы можете использовать модуль PHP LDAP для подключения и аутентификации в своем скрипте, но без AD нет LDAP. Что эквивалентно для автономных машин?


person Martin    schedule 13.09.2008    source источник


Ответы (2)


I haven't found a simple solution either. There are examples using CreateObject and the WinNT ADSI provider. But eventually they all bump into User authentication issues with the Active Directory Service Interfaces WinNT provider. I'm not 100% sure but I guess the WSH/network connect approach has the same problem.
According to How to validate user credentials on Microsoft operating systems you should use LogonUser or SSPI.
It also says

LogonUser Win32 API does not require TCB privilege in Microsoft Windows Server 2003, however, for downlevel compatibility, this is still the best approach.

В Windows XP больше не требуется, чтобы процесс имел привилегию SE_TCB_NAME для вызова LogonUser. Таким образом, самый простой способ проверить учетные данные пользователя в Windows XP — вызвать LogonUser API.

Поэтому, если бы я был уверен, что поддержка Win9x/2000 не нужна, я бы написал расширение, которое предоставляет LogonUser доступ к php.
Вас также может заинтересовать Аутентификация пользователя из учетных записей NT. Он использует расширение w32api и нуждается в поддержке dll ... Я бы предпочел написать это маленькое расширение LogonUser ;-)
Если это невозможно, я бы, вероятно, изучил модуль fastcgi для IIS и насколько он стабилен. есть, и пусть IIS обрабатывает аутентификацию.

edit:
Я также пытался использовать System.Security.Principal.WindowsIdentity и php com/.net расширение. Но конструктор dotnet, похоже, не позволяет передавать параметры конструктору объектов, и мой «эксперимент» по получению сборки (а вместе с ней и CreateInstance()) из GetType() не удался с ошибкой «неизвестный zval».

person VolkerK    schedule 14.09.2008

Хороший вопрос!

Я подумал об этом... и не могу придумать хорошего решения. Что я могу придумать, так это ужасный ужасный хак, который может сработать. Увидев, что никто не опубликовал ответ на этот вопрос почти день, я подумал, что плохой, но рабочий ответ будет в порядке.

Файл SAM недоступен во время работы системы. Есть некоторые трюки с внедрением DLL, которые вы можете заставить работать, но в конце концов вы просто получите хэши паролей, и вам все равно придется хешировать пароли, предоставленные пользователем, чтобы сопоставить их.

Что вам действительно нужно, так это что-то, что пытается аутентифицировать пользователя по файлу SAM. Я думаю, вы можете сделать это, выполнив что-то вроде следующего.

  1. Создайте общий файловый ресурс на сервере и сделайте так, чтобы доступ к нему был предоставлен только тем учетным записям, которым вы хотите разрешить вход в систему.
  2. В PHP используйте системную команду для вызова сценария wsh, который: монтирует общий ресурс, используя имя пользователя и пароль, предоставленные пользователем веб-сайта. записывает, если он работает, а затем размонтирует диск, если он работает.
  3. Соберите результат как-нибудь. Результат может быть возвращен в php либо через стандартный вывод скрипта, либо, возможно, с использованием кода возврата скрипта.

Я знаю, что это не очень красиво, но это должно сработать.

Я чувствую себя грязным :|

Изменить: причиной вызова внешнего сценария wsh является то, что PHP не позволяет вам использовать пути UNC (насколько я помню).

person Allain Lalonde    schedule 14.09.2008