У меня есть два пользовательских веб-сервиса, построенных поверх 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