我使用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)来摆脱这种行为,但是我不能依靠管理员来使用它来让我的解决方案运行
所以我仍然没有解决方案
答案 0 :(得分:1)
我找到了解决这个问题的黑客。我不会用它,因为它真的很脏,但也许有人需要它,所以:
SPSecurity.RunWithElevatedPrivileges
)运行用于更改场属性的部分。System.Web.HttpContext.Current.Items["FormDigestValidated"] = true;
正如我所说,不是一个好人,而是工作......
答案 1 :(得分:0)
可能会复制调用进程的安全凭据。您可以配置WCF是否执行此操作。
有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/ms731925.aspx。