从SharePoint中托管的WCF服务访问SPFarm PropertyBag时出现SecurityException

时间:2010-10-18 11:14:41

标签: c# .net wcf sharepoint sharepoint-2010

我使用this tutorial在SharePoint 2010(basicHttpBinding)中托管了WCF服务。程序集部署到GAC并包含WCF服务和timerjob。两者都调用相同的方法。 timerjob工作成功。

但是当我调用WCF服务的方法时,我得到一个异常,它无法在SPFarm PropertyBag中写一个属性。

System.Security.SecurityException: Access denied.
   at Microsoft.SharePoint.Administration.SPPersistedObject.BaseUpdate()
   at Microsoft.SharePoint.Administration.SPFarm.Update()
   at MyCompany.MyProduct.Business.Config.SetPropertyValue(IPropertyBag propertyBag, String propertyName, String value)
The Zone of the assembly that failed was:
MyComputer

我尝试使用Farm Administrator帐户调用该方法,并尝试使用SPSecurity.RunWithElevatedPrivileges,但没有成功。

我在提升的权限块内外检查了WindowsIdentity.GetCurrent(),在调用者用户之外,其中是WebApplications AppPool的用户

因此AppPool用户被正确模拟,但SharePoint 2010“disallows modification ... to all objects inheriting from SPPersistedObject in the Microsoft.SharePoint.Administration namespace ... from content web applications

文章说,有一个转换SPWebService.ContentService.RemoteAdministratorAccessDenied(命名空间Microsoft.SharePoint.Administration)来摆脱这种行为,但是我不能依靠管理员来使用它来让我的解决方案运行

所以我仍然没有解决方案

2 个答案:

答案 0 :(得分:1)

我找到了解决这个问题的黑客。我不会用它,因为它真的很脏,但也许有人需要它,所以:

  1. 不要通过普通的Web应用程序URL调用WCF服务。使用管理中心的网址(例如http://myserver:9999/_vti_bin/project/myservice.svc
  2. 使用提升的权限(SPSecurity.RunWithElevatedPrivileges)运行用于更改场属性的部分。
  3. 在升高的部分(现在变得非常脏)之前设置System.Web.HttpContext.Current.Items["FormDigestValidated"] = true;
  4. 正如我所说,不是一个好人,而是工作......

答案 1 :(得分:0)

可能会复制调用进程的安全凭据。您可以配置WCF是否执行此操作。

有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/ms731925.aspx