Я знаю, что на SO много вопросов, похожих на эти, но я не смог найти ни одного для этой конкретной проблемы.
Сначала пара баллов:
- У меня нет контроля над нашим сервером Sharepoint. Я не могу настроить параметры IIS.
- Я считаю, что наша версия сервера IIS - IIS 7.0.
- Наш сервер Sharepoint ожидает запросы через NTLM.
- Наш сервер Sharepoint Server находится в том же домене, что и мой клиентский компьютер.
- Я использую .NET Framework 3.5, Visual Studio 2008
Я пытаюсь написать простое консольное приложение для манипулирования данными Sharepoint с помощью веб-служб Sharepoint. Я добавил ссылку на сервис, и вот мой app.config:
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="ListsSoap" closeTimeout="00:01:00" openTimeout="00:01:00"
receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false"
bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="Transport">
<transport clientCredentialType="Ntlm" proxyCredentialType="Ntlm" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="https://subdomain.companysite.com/subsite/_vti_bin/Lists.asmx"
binding="basicHttpBinding" bindingConfiguration="ListsSoap"
contract="ServiceReference1.ListsSoap" name="ListsSoap" />
</client>
</system.serviceModel>
Это мой код:
static void Main(string[] args)
{
using (var client = new ListsSoapClient())
{
client.ClientCredentials.Windows.ClientCredential = new NetworkCredential("username", "password", "domain");
client.GetListCollection();
}
}
Когда я вызываю GetListCollection (), выдается следующее MessageSecurityException :
The HTTP request is unauthorized with client authentication scheme 'Ntlm'.
The authentication header received from the server was 'NTLM'.
С внутренним WebException:
"The remote server returned an error: (401) Unauthorized."
Я пробовал различные привязки и различные настройки кода, чтобы попытаться правильно аутентифицироваться, но безрезультатно. Я перечислю их ниже.
Я пробовал следующие шаги:
Использование собственного имитатора Win32 перед созданием клиента
using (new Impersonator.Impersonator("username", "password", "domain"))
using (var client = new ListsSoapClient())
{
client.ClientCredentials.Windows.ClientCredential = new NetworkCredential("dpincas", "password", "domain");
client.GetListCollection();
}
При этом выдается то же сообщение об ошибке.
Настройка TokenImpersonationLevel для учетных данных моего клиента
using (var client = new ListsSoapClient())
{
client.ClientCredentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Impersonation;
client.GetListCollection();
}
При этом выдается то же сообщение об ошибке.
Использование режима безопасности = TransportCredentialOnly
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Ntlm" />
</security>
Это привело к другому сообщению об ошибке:
The provided URI scheme 'https' is invalid; expected 'http'.
Parameter name: via
Однако мне нужно использовать https, поэтому я не могу изменить схему URI.
Я пробовал некоторые другие комбинации, которые я не могу вспомнить, но я опубликую их, когда я это сделаю. Я действительно в остроумии здесь. Я вижу много ссылок в Google, которые говорят «переключиться на Kerberos», но мой сервер, похоже, принимает только NTLM, а не «Negotiate» (как было бы сказано, если он ищет Kerberos), так что, к сожалению, это не вариант .
Любая помощь, люди?