Настройка проверки подлинности NTLM с помощью WCF для веб-служб Sharepoint - PullRequest
6 голосов
/ 22 апреля 2011

У меня возникли большие трудности при настройке службы WCF для общения с веб-службами Sharepoint, в частности, я пытаюсь использовать службы Lists.asmx и Copy.asmx.

Я заработал, используя http-ссылку для sharepoint для разработки, но теперь нам нужно переключиться на HTTPS-ссылку. Я получил настройку веб-ссылки и обновил эту ссылку, но когда он пытается вызвать службу (например, GetListItems), он выдает ошибку со следующей ошибкой: Сбой запроса с состоянием HTTP 401: неавторизован.

Затем я попытался выяснить, какой тип аутентификации использует наш сервер Sharepoint Server, который оказывается NTLM. Затем я попытался настроить файл web.config для этого. Вот весь файл web.config:

<?xml version="1.0"?>
<configuration>
    <configSections>
        <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
            <section name="InventoryService.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/>
        </sectionGroup>
    </configSections>
    <appSettings/>
    <connectionStrings/>
    <system.web>
        <compilation debug="true" targetFramework="4.0">
        </compilation>
        <!--
        The <authentication> section enables configuration 
        of the security authentication mode used by 
        ASP.NET to identify an incoming user. 
    -->
        <authentication mode="Windows"/>
        <!--
        The <customErrors> section enables configuration 
        of what to do if/when an unhandled error occurs 
        during the execution of a request. Specifically, 
        it enables developers to configure html error pages 
        to be displayed in place of a error stack trace.

        <customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
         <error statusCode="403" redirect="NoAccess.htm" />
         <error statusCode="404" redirect="FileNotFound.htm" />
        </customErrors>
    -->
        <pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID"/></system.web>
    <!-- 
      The system.webServer section is required for running ASP.NET AJAX under Internet
      Information Services 7.0.  It is not necessary for previous version of IIS.
  -->
    <system.serviceModel>
        <bindings>
   <basicHttpBinding>
    <binding name="NewBinding0">
     <security mode="TransportCredentialOnly">
      <transport clientCredentialType="Ntlm" proxyCredentialType="None" />
     </security>
    </binding>
   </basicHttpBinding>
  </bindings>
  <services>
   <service behaviorConfiguration="InventoryService.Service1Behavior"
    name="InventoryService.InventoryService">
    <endpoint address="" binding="basicHttpBinding" bindingConfiguration="NewBinding0"
     contract="InventoryService.IInventoryService">
     <identity>
      <dns value="localhost" />
     </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
   </service>
  </services>
        <behaviors>
            <serviceBehaviors>
                <behavior name="InventoryService.Service1Behavior">
                    <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
                    <serviceMetadata httpGetEnabled="true"/>
                    <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
                    <serviceDebug includeExceptionDetailInFaults="true"/>
                </behavior>
            </serviceBehaviors>
        </behaviors>
    </system.serviceModel>
    <applicationSettings>
        <InventoryService.Properties.Settings>
   <setting name="InventoryService_WSCopy_Copy" serializeAs="String">
    <value>http://site/_vti_bin/Copy.asmx</value>
   </setting>
   <setting name="InventoryService_SharepointLists_Lists" serializeAs="String">
    <value>https://site/_vti_bin/Lists.asmx</value>
   </setting>
  </InventoryService.Properties.Settings>
    </applicationSettings>
</configuration>

Если у кого-то есть подсказка, правильно ли я настроил этот файл конфигурации для NTLM, это было бы очень полезно.

Если все настроено правильно, то, я думаю, я перейду к следующему вопросу о том, правильно ли я установил учетные данные:

inventoryList = new SharepointLists.Lists();
inventoryList.Url = "https://fullsiteurl/_vti_bin/Lists.asmx";
inventoryList.Credentials = new System.Net.NetworkCredential("user", "pass", "domain");

Если бы кто-то мог пройти через это, это также было бы очень полезно.

Опять же, я знаю, что файл конфигурации довольно длинный, и я очень признателен, если вы пройдете через него, дайте мне знать, правильно ли я настроил проверку подлинности NTLM.

Если все это подтвердится, тогда я понятия не имею, с чего начать при получении HTTPS-ссылки с работающей sharepoint (Существующая HTTP-ссылка на sharepoint пока доступна, пока я не смогу заставить службу работать с HTTPS ссылка).

Ответы [ 2 ]

0 голосов
/ 26 сентября 2012

Вы получаете эту ошибку, потому что вы не указали, что mexHttpBinding также использует конфигурацию привязки 'NewBinding0'. Происходит то, что до вашего фактического вызова службы WCF WCF пытается получить некоторую информацию об услуге. Этот запрос не будет выполнен, если он не будет передавать какую-либо учетную информацию клиента службе, поскольку он защищен, и вы получите ответ 401 от сервера (не авторизован). Убедитесь, что ваш mexHttpBinding также отправляет учетные данные NTLM.

Вы также можете удалить mexHttpBinding

0 голосов
/ 26 апреля 2011

Убедитесь, что указанный пользователь имеет доступ к ASMX через браузер.

Убедитесь, что у пользователя есть (как минимум) разрешение на чтение в целевой библиотеке.

Кроме того, убедитесь, что у пользователя есть разрешение Use Remote Interfaces (WSS 3.0: Настройки сайта, Дополнительные разрешения, Настройки - Уровни разрешений, выберите соответствующий уровень разрешений).

Кроме того, если вы используете MOSS 2007, доступ к SOAP может быть отключен в центральном администраторе.

В данный момент у меня нет Sharepoint 2010, поэтому я не могу проверить, но я ожидаю, что настройки будут соответствующими.

Редактировать

Если бы все нормально работало при обычном HTTP, я бы посмотрел, как был включен HTTPS.

Взгляните на этот сайт " Как включить SSL в веб-приложении SharePoint 2010 ", особенно во второй части (около 1/3 страницы, касающейся добавления альтернативного сопоставления доступа).

Надеюсь, это поможет.

...