Запрос HTTP несанкционирован со схемой 'Ntlm' аутентификации клиента, заголовок аутентификации, полученный от сервера, был 'NTLM'

Я знаю, что существует много вопросов на НАСТОЛЬКО подобном этому, но я не мог найти один для этой конкретной проблемы.

Несколько точек, во-первых:

  • Я не имею никакого контроля над нашим сервером Sharepoint. Я не могу настроить настройки IIS.
  • Я полагаю, что наша серверная версия IIS является IIS 7.0.
  • Наш Сервер Sharepoint ожидает запросы через NTLM.
  • Наш Сервер Sharepoint находится на том же домене как мой клиентский компьютер.
  • Я использую Платформу.NET 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();
}

Это произвело то же сообщение об ошибке.


Используя безопасность mode=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, не "Согласовывают" (как он сказал бы, искал ли он Kerberos), так, чтобы была, к сожалению, не опция.

Какая-либо справка там, люди?

49
задан MackM 26 February 2018 в 03:58
поделиться

7 ответов

Visual Studio 2005

  1. Создайте новое консольное приложение проект в Visual Studio
  2. Добавьте «Веб-ссылку» к веб-службе Lists.asmx.
    • Ваш URL, вероятно, будет выглядеть так: http: // servername / sites / SiteCollection / SubSite / _vti_bin / Lists.asmx
    • Я назвал свою веб-ссылку: ListsWebService
  3. Напишите код в program.cs (у меня здесь есть список проблем)

Вот код.

using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;

namespace WebServicesConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                ListsWebService.Lists listsWebSvc = new WebServicesConsoleApp.ListsWebService.Lists();
                listsWebSvc.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;
                listsWebSvc.Url = "http://servername/sites/SiteCollection/SubSite/_vti_bin/Lists.asmx";
                XmlNode node = listsWebSvc.GetList("Issues");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }
    }
}

Visual Studio 2008

  1. Создайте новый проект консольного приложения в Visual Studio
  2. Щелкните правой кнопкой мыши ссылку и добавьте ссылку на службу
  3. Вставьте URL-адрес службы Lists.asmx на вашем сервере
    • Пример: http: //servername/sites/SiteCollection/SubSite/_vti_bin/Lists.asmx
  4. Нажмите Go
  5. Нажмите OK
  6. Внесите следующие изменения в код:

Измените файл app.config с:

<security mode="None">
    <transport clientCredentialType="None" proxyCredentialType="None"
        realm="" />
    <message clientCredentialType="UserName" algorithmSuite="Default" />
</security>

На:

<security mode="TransportCredentialOnly">
  <transport clientCredentialType="Ntlm"/>
</security>

Измените файл program.cs и добавьте следующий код в свою функцию Main:

ListsSoapClient client = new ListsSoapClient();
client.ClientCredentials.Windows.ClientCredential = System.Net.CredentialCache.DefaultNetworkCredentials;
client.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
XmlElement listCollection = client.GetListCollection();

Добавьте операторы using:

using [your app name].ServiceReference1;
using System.Xml;

Ссылка: http://sharepointmagazine.net/technical/development/writing-caml-queries-for-retrieving-list-items-from-a-sharepoint-list

40
ответ дан 7 November 2019 в 11:52
поделиться

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

Вы сказали, что мох находится в том же домене, что и ваше приложение. Если у вас есть доступ к сайту с вашим пользователем (который вошел в систему) ... пробовали ли вы:

client.ClientCredentials.Windows.ClientCredential = System.Net.CredentialCache.DefaultNetworkCredentials;
2
ответ дан 7 November 2019 в 11:52
поделиться

Попробуйте это

<client>
  <endpoint>
    <identity>
      <servicePrincipalName value="" />
    </identity>
  </endpoint>
</client>

Я сталкивался с этой ошибкой раньше при работе на веб-ферме, и это исправило ее для меня.

0
ответ дан 7 November 2019 в 11:52
поделиться

Я бы попытался подключиться к вашему сайту Sharepoint с помощью этого инструмента здесь . Если это сработает, вы можете быть уверены, что проблема в вашем коде / конфигурации. Возможно, это не решит вашу проблему сразу, но исключает, что с сервером что-то не так. Предполагая, что это не работает, я бы исследовал следующее:

  • У вашего пользователя действительно достаточно прав на сайте?
  • Есть ли прокси, который мешает? (Ваша конфигурация немного похожа на прокси-сервер. Можете ли вы обойти его?)

Я думаю, что нет ничего плохого в использовании режима безопасности Transport , но я не уверен насчет proxyCredentialType = "Ntlm" , возможно, следует установить значение None .

2
ответ дан 7 November 2019 в 11:52
поделиться

Если я правильно помню, есть некоторые проблемы с добавлением веб-служб SharePoint в качестве «Справочника по службам» VS2K8. Для правильной работы вам необходимо добавить его как «Веб-ссылку» в старом стиле.

3
ответ дан 7 November 2019 в 11:52
поделиться

На прошлой неделе у меня была точно такая же проблема - Программа WCF странно ведет себя на одном сервере - почему?

Для меня решение было довольно простым. Sharepoint имеет собственный набор разрешений. Мой клиент попытался войти в систему как пользователь, которому явно не был предоставлен доступ к веб-сервису через панель администрирования Sharepoint.

Я добавил пользователя в белый список Sharepoint и бах, это сработало.

Даже если проблема не в этом, обратите внимание, что

HTTP-запрос неавторизован с использованием схемы аутентификации клиента «Ntlm». Заголовок аутентификации, полученный от сервера, был «NTLM».

Означает (на английском языке), что у вас просто нет разрешения. Ваш протокол, вероятно, правильный - у вашего пользователя просто нет разрешений.

2
ответ дан 7 November 2019 в 11:52
поделиться

У меня уже была такая проблема.

client.ClientCredentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Impersonation;

сделайте это против вашего прокси wcf перед звонком.

2
ответ дан 7 November 2019 в 11:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: