Я звоню в веб-службу (с именем SecurityService), как показано ниже:
SecurityService.Service securityService = new SecurityService.Service();
securityService.Credentials = networkCredential;
return securityService.GetUserToken();
В службе включена аутентификация Windows, больше ничего.
Этот фрагмент кода выше работает с удаленных машин.
Когда я отправляю этот же код на сервер IIS, на котором работает эта служба, я получаю ошибку 401:
The request failed with HTTP status 401: Unauthorized.
Я попробовал тот же кусок кода с WCF:
ServiceSoapClient client = new ServiceSoapClient();
client.ClientCredentials.Windows.ClientCredential = networkCredential;
return client.GetUserToken();
со следующими настройками:
<binding name="ServiceSoap">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows" proxyCredentialType="None" realm=""/>
</security>
</binding>
Опять же, на сервере я не могу заставить его аутентифицироваться, с другого компьютера, подключенного к этому серверу, он работает.
Вот заголовки, полученные при расширенной регистрации в веб-сервисе:
Когда это работает:
sc-win32-status WWW-Authenticate Authorization
2147024891 "NTLM,Negotiate" -
0 - "Negotiate TlRMTVNTUAADAAAAGAAYAIoAAACi...."
При сбое вызывается из того же сервера:
sc-win32-status WWW-Authenticate Authorization
2147024891 "NTLM,Negotiate" -
1073741715 "NTLM,Negotiate" "Negotiate ADAAAAGAAYAI4AAACiAaIBpgAAABoAGgBY..."
Я также получил это сообщение вместо простой ошибки 401, когда использовал WCF:
The HTTP request is unauthorized with client authentication scheme 'Negotiate'. The authentication header received from the server was 'NTLM,Negotiate'. ---> The remote server returned an error: (401) Unauthorized.
Объяснение ошибки 1073741715:
STATUS_LOGON_FAILURE (-1073741715 (0xC000006D))
The attempted logon is not valid. This is due to either an incorrect user name or incorrect authentication information.
Почему-то мой код не проходит аутентификацию на веб-сервисе правильно, когда он запускается изнутри сервера.
Вот ссылка на ту же проблему. Ответ не распространяется, хотя:
401 Клиент «Согласование», сервер «Согласование, NTLM» при вызове сервера WCF на сервер