Я пишу веб-приложение 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, где я могу ее взять или как ее скомпилировать? Если есть другое решение, я был бы очень рад его услышать.
Спасибо всем, что уделили мне время и ответили!
Задача ещё не решена.
Других решений пока нет …