我在_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请求。
答案 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;
然后使用此令牌以此用户身份打开网站和网站。