我目前在启用声明的 SharePoint 2010 网站中部署了 WCF 服务。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 服务器与您的声明提供者建立了信任关系,否则它可能无法正常工作。