Олицетворение в службе WCF, размещенной в SharePoint 2010 с проверкой подлинности на основе утверждений - PullRequest
2 голосов
/ 23 марта 2011

У меня есть служба WCF, которая использует wsHttpBinding с защитой сообщений и аутентификацией Windows.

Клиент службы консольного приложения может вызывать службу, и я вижу, что оба ServiceSecurityContext.Current.WindowsIdentity и Thread.CurrentPrincipal.Identity представляют нужного пользователя.

Текущим принципалом являетсяa IClaimsIdentity, как и ожидалось.

Проблема возникает, когда я пытаюсь открыть веб-сайт SharePoint: я получаю сообщение об ошибке «Отказано в доступе», из-за которого невозможно выдать себя за олицетворенную личность на базу данных или на сервер sharepoint.Это все на одном компьютере, поэтому не должно быть никаких проблем с аутентификацией двойного прыжка.

Разве это не правильный способ выполнения безголовой аутентификации для службы, размещенной в приложении утверждений?

1 Ответ

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

В настоящее время у меня есть службы WCF, которые развернуты на сайте SharePoint 2010 с поддержкой утверждений.В сервисах WCF нет ничего особенного, и я использую Microsoft.SharePoint.Client.Services.MultipleBaseAddressBasicHttpBindingServiceHostFactory в качестве фабрики услуг WCF.Таким образом, я использую готовую BasicHttpBinding, предоставляемую на заводе.

Мой клиентский app.config выглядит следующим образом:

<configuration>
  <system.serviceModel>
    <bindings>
      <binding name="BasicHttpBinding_MyServices" closeTimeout="00:01:00"
        openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
        allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
        maxBufferSize="200524288" maxBufferPoolSize="200524288" maxReceivedMessageSize="200524288"
        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="Ntlm" proxyCredentialType="None" realm="" />
          <message clientCredentialType="UserName" algorithmSuite="Default" />
        </security>
      </binding>
    </bindings>
    <client>
      <endpoint address="http://localhost/_vti_bin/MyServices/MyService.svc"
        binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_MyServices"
        contract="ServiceClient.MyService.IMyService"
        name="BasicHttpBinding_IMyService" />
    </client>
  </system.serviceModel>
</configuration>

При взгляде на мой Thread.CurrentPrincipal.Identity все верно.Это ClaimsIdentity с моим текущим пользователем.Затем я могу просто открыть новый экземпляр SPSite без необходимости создавать или использовать SPUserToken.

Одна ключевая вещь, на которую следует обратить внимание: я не выдаю себя за свою личность до подключения к службе WCF.Если это то, что вы делаете, это вряд ли сработает, если ваш сервер SharePoint не имеет установленного доверия с вашим поставщиком утверждений.

...