在SharePoint上运行的SOAP Web服务

时间:2009-03-30 20:48:45

标签: web-services sharepoint soap

我在_layouts目录下的sharepoint框上运行了一个SOAP Web服务,以及一个使用该SOAP服务的胖客户端。我们有一个使用基本身份验证的sharepoint框,另一个使用客户端证书。我需要SOAP服务来更新文档库中的一些列表项。除非我在提升的权限块内运行,否则我遇到的问题似乎无济于事。这是我正在尝试做的代码片段。

using (SPSite site = new SPSite(fileUrl))
using (SPWeb web = site.OpenWeb()) {
   // web.CurrentUser is always null unless in elevated privileges block.
   // do something with document library...
   web.Files.Add(...); // fails with access denied unless in elevated privileges block.
}

我也尝试了“SPContext.Current.Web”,但即使我处于提升权限块,它也会为“web.CurrentUser”返回null。

我真的无法使用提升权限阻止,因为用户抱怨我的SOAP服务触及的任何内容都被系统修改过。

从胖客户端我们使用的代码如下......

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestString);
if(basicAuth) {
   request.Credentials = System.Net.CredentialCache.DefaultCredentials;
}
else {
   X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
   store.Open(OpenFlags.ReadOnly);
   foreach (X509Certificate2 certificate in store.Certificates) {
      request.ClientCertificates.Add(certificate);
}
request.GetResponse();

我们出于各种原因手动构建SOAP请求。

1 个答案:

答案 0 :(得分:1)

如果您希望您的webservice在sharepoint上下文中正确集成(即能够查询“当前sharepoint用户”),您应该将其部署到_vti_bin(12 hyve的ISAPI子文件夹),而不是_layouts。

发现有点痛苦,需要手动调整文件(有关详细信息,请参阅the MSDN article on custom webservices within SharePoint),但是当您手动构建请求时,发现应该不是问题。

[编辑] 作为替代方案,您可以尝试获取经过Windows身份验证的用户的SPUserToken,

SPUserToken token = web.AllUsers[WindowsIdentity.GetCurrent().Name].UserToken;

然后使用此令牌以此用户身份打开网站和网站。