Пользовательская веб-служба Sharepoint 2010 - HTTP-запрос не авторизован с помощью схемы аутентификации клиента 'Ntlm' - PullRequest
0 голосов
/ 01 марта 2011

У меня есть два пользовательских веб-сервиса, построенных поверх SharePoint. Мы поменяли серверы и обновили сайт с 2008 по 2010 год за выходные. Теперь я вижу следующие ошибки на каждом веб-сервисе при просмотре через оболочку веб-сервиса .NET.

System.ServiceModel.Security.MessageSecurityException: The HTTP request is unauthorized with client authentication scheme 'Ntlm'. The authentication header received from the server was 'NTLM'. ---> System.Net.WebException: The remote server returned an error: (401) 

и

System.Net.WebException: The request failed with HTTP status 401: Unauthorized.

У веб-сервисов есть dll, которые живут в GAC, а файлы ASMX - в папке кустов LAYOUTS. Они работали нормально до обновления / перемещения сервера.

Я думаю, что происходит из-за того, что учетные данные Windows по умолчанию не передаются службе. Моя веб-служба вызывает веб-службы SharePoint для получения содержимого списка.

Вот пример одного из вызовов, который возвращает 401:

<WebMethod()> _
Public Function TestGetUserInfo() As String
    Dim userService As New SharepointUser.UserGroup
    userService.Credentials = System.Net.CredentialCache.DefaultCredentials

    Dim UserInfoXML As XmlNode = userService.GetUserInfo(User.Identity.Name)

    Return UserInfoXML.ChildNodes(0).Attributes("Name").Value
End Function

Этот вызов идет против: http://{DomainName}/_vti_bin/Lists.asmx?wsdl

Я подтвердил, что user.identity.name возвращает правильную информацию о пользователе. Я думаю, что это system.net.credentialcahche.defaultcredentials, который не работает. Я также попытался .defaultnetworkcredentials без удачи.

Это то, что у меня есть в web.config:

  <system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
<bindings>
  <basicHttpBinding>
    <binding name="projectBasicHttpConf" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="true" maxBufferSize="4194304" maxReceivedMessageSize="500000000" messageEncoding="Text" transferMode="StreamedResponse">
      <security mode="TransportCredentialOnly">
        <transport clientCredentialType="Windows" proxyCredentialType="None" realm="" />
        <message clientCredentialType="UserName" algorithmSuite="Default" />
      </security>
    </binding>
    <binding name="BasicHttpBindingWithWindowsAuthentication">
      <security mode="TransportCredentialOnly">
        <transport clientCredentialType="Windows" proxyCredentialType="None" />
        <message clientCredentialType="UserName" algorithmSuite="Default" />
      </security>
    </binding>
    <binding name="SPFilesAccessServiceSoap" 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="TransportCredentialOnly">
        <transport clientCredentialType="Windows" proxyCredentialType="None" realm="" />
        <message clientCredentialType="UserName" algorithmSuite="Default" />
      </security>
    </binding>
  </basicHttpBinding>
</bindings>
<behaviors>
  <endpointBehaviors>
    <behavior name="clientEndPointBehavior">
      <clientCredentials>
        <windows allowedImpersonationLevel="Impersonation" />
      </clientCredentials>
    </behavior>
  </endpointBehaviors>
</behaviors>

Под system.web:

<authentication mode="Windows" />
<identity impersonate="true" />

Я ходил туда-сюда с анонимной аутентификацией без удачи.

В IIS у меня включена проверка подлинности Windows и NTLM в качестве поставщика.

Есть идеи как это исправить? Большое спасибо за чтение.

-Nate

Ответы [ 3 ]

0 голосов
/ 10 марта 2012

все, что вам нужно передать от клиента - это System.Net.NetworkCredentials («Имя пользователя», Пароль »,« Домен »);

Это должно решить проблему, которую я предполагаю.

0 голосов
/ 16 декабря 2012

Поскольку вы решили эту проблему, используя объектную модель сервера вместо вызова веб-службы (который будет работать только на сервере), это может быть функцией обратной проверки, вызывающей 401-е. Вот MS KB- http://support.microsoft.com/kb/896861

Рекомендуется использовать метод указания хостов вместо параметра отключения реестра.

0 голосов
/ 02 марта 2011

Я так и не понял.Я сделал обходной путь, когда я вызвал материал пространства имен Microsoft.Sharepoint напрямую, вместо вызова веб-службы.Это обошло вопросы безопасности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...