Аутентификация в веб-сервисе с Kerberos из PHP в IIS

Я пишу веб-приложение PHP, которое должно подключаться к веб-сервису с использованием аутентификации Kerberos 5 (Active Directory). Мой сайт PHP размещен на IIS 7.5 с PHP 5.5. Пул приложений выполняется под учетной записью, авторизованной в Active Directory и для целевого веб-сервиса.

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

Это код PHP, который я сейчас использую:

$url = 'http://mywebservice/login/kerberos';

$ch = curl_init();

$options = [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_VERBOSE        => true,
CURLOPT_HTTPAUTH       => CURLAUTH_GSSNEGOTIATE,
CURLOPT_HTTPHEADER     => ['Authorization: Negotiate'],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_USERPWD        => 'myuser',
CURLOPT_URL            => $url,
CURLOPT_HEADER         => 1
];

curl_setopt_array( $ch, $options);

$result = curl_exec($ch);$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($result, 0, $header_size);
$body = substr($result, $header_size);

print $result;

Это дает мне следующее сообщение:

HTTP/1.1 302 Found Date: Fri, 21 Oct 2016 14:49:15 GMT X-Robots-Tag: noindex,nofollow WWW-Authenticate: Location: http://mywebservice/login?login_fail Content-Length: 0

Когда я удаляю CURLOPT_HTTPHEADER => [‘Authorization: Negotiate’], я получаю внутреннюю ошибку сервера из модуля curl.

Когда я использую curl commandLine, я получаю следующий результат:

curl --negotiate http://mywebservice/login/kerberos -umyuser@mydomain --verbose -c "c:\cookie.txt" -b "c:\cookie.txt"
Enter host password for user 'myuser@mydomain':
*   Trying (192.168.1.1...
* Connected to mywebservice (192.168.1.1) port 80 (#0)
> GET /login/kerberos HTTP/1.1
> User-Agent: curl/7.41.0
> Host: mywebservice
> Accept: */*
> Cookie: JSESSIONID_PUBLIC=X(MASKED)XXXXXXXXXXXXXXXXX
>
< HTTP/1.1 401 Unauthorized
< Date: Fri, 21 Oct 2016 14:52:46 GMT
< X-Robots-Tag: noindex,nofollow
< WWW-Authenticate: Negotiate
< Expires: Thu, 01 Jan 1970 00:00:00 GMT
< Last-Modified: Thu, 20 Oct 2016 14:52:46 GMT
< Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
< Pragma: no-cache
< P3P: CP=CAO PSA OUR
< Content-Type: text/html; charset=UTF-8
< Content-Length: 3643
<
* Ignoring the response-body
* Connection #0 to host mywebservice left intact
* Issue another request to this URL: 'http://mywebservice/login/kerberos'
* Found bundle for host mywebservice: 0xXXXXXXX
* Re-using existing connection! (#0) with host mywebservice
* Connected to mywebservice (192.168.1.1) port 80 (#0)
* Server auth using Negotiate with user 'myuser@mydomain'
> GET /login/kerberos HTTP/1.1
> Authorization: Negotiate X(MASKED)XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXD
w==

> User-Agent: curl/7.41.0
> Host: mywebservice
> Accept: */*
> Cookie: JSESSIONID_PUBLIC=X(MASKED)XXXXXXXXXXXXXXXXX
>
< HTTP/1.1 302 Found
< Date: Fri, 21 Oct 2016 14:52:46 GMT
< X-Robots-Tag: noindex,nofollow
< WWW-Authenticate:
< Location: http://mywebservice/?login_fail
< Content-Length: 0
<
* Connection #0 to host mywebservice left intact

Когда я тестирую с помощью инструмента KerberosAuthenticationTester (http://blog.michelbarneveld.nl/michel/archive/2009/12/05/kerberos-authentication-tester.aspx) он аутентифицирует меня сразу же, когда я передаю URL и учетные данные.

Я предполагаю, что это не работает, потому что мне не хватает библиотеки krb5. Я не смог найти его как DLL, поэтому я попытался перекомпилировать его с исходным кодом PHP в Visual Studio. У меня это тоже не работает, мне не хватает файла config.w32. При необходимости я могу уточнить это, но сначала я хочу знать, действительно ли это необходимо.
Я также установил MIT Kerberos, но это не помогло.

Это правильно, что мне нужна DLL-библиотека krb5, или я на неправильном пути? Если мне нужна эта DLL, где я могу ее взять или как ее скомпилировать? Если есть другое решение, я был бы очень рад его услышать.
Спасибо всем, что уделили мне время и ответили!

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]