代码之家  ›  专栏  ›  技术社区  ›  Hinek

从SharePoint中承载的WCF服务访问SPFarm PropertyBag时的SecurityException

  •  2
  • Hinek  · 技术社区  · 14 年前

    我在SharePoint2010(basichttpbinding)中使用 this tutorial . 程序集部署到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
    

    我尝试使用服务器场管理员帐户调用该方法,并尝试使用带有ElevatedPrivileges的spsecurity.run,但没有成功。

    我检查了提升权限块内部和外部的windowsIdentity.getcurrent(),外部是调用方用户,内部是 WebApplications应用程序应用程序池的用户 .

    因此正确模拟了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 回复  |  直到 14 年前
        1
  •  1
  •   Hinek    14 年前

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

    1. 不要通过普通的Web应用程序URL调用WCF服务。使用管理中心的URL(例如 http://myserver:9999/_vti_bin/project/myservice.svc )
    2. 使用提升的权限运行更改服务器场属性的部分( SPSecurity.RunWithElevatedPrivileges )
    3. 在升高部分(现在变得很脏)设置之前 System.Web.HttpContext.Current.Items["FormDigestValidated"] = true;

    正如我所说,不是一个好的,但工作…

        2
  •  0
  •   Pieter van Ginkel    14 年前

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

    http://msdn.microsoft.com/en-us/library/ms731925.aspx 更多信息。