SecurityException при доступе к SPFarm PropertyBag из службы WCF, размещенной в SharePoint - PullRequest
2 голосов
/ 18 октября 2010

Я размещал службу WCF в SharePoint 2010 (basicHttpBinding), используя это руководство . Сборка развернута в GAC и содержит службу WCF и задание таймера. Оба вызывают один и тот же метод. Timejob работает успешно.

Но когда я вызываю метод службы 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

Я пытался вызвать метод с использованием учетной записи администратора фермы и пытался использовать SPSecurity.RunWithElevatedPrivileges, но безуспешно.

Я проверил WindowsIdentity.GetCurrent () внутри и снаружи блока повышенных привилегий, вне его - это пользователь вызывающего абонента, а внутри - пользователь WebApplications AppPool .

Таким образом, пользователь AppPool правильно олицетворяет себя, но SharePoint 2010 " запрещает изменение ... всех объектов, унаследованных от SPPersistedObject в пространстве имен Microsoft.SharePoint.Administration ... из веб-приложений содержимого "

В статье говорится, что для избавления от этого поведения есть переключатель SPWebService.ContentService.RemoteAdministratorAccessDenied (пространство имен Microsoft.SharePoint.Administration), но я не могу полагаться на администраторов, чтобы использовать это для запуска моего решения .

Так что я до сих пор без решения

Ответы [ 2 ]

1 голос
/ 18 октября 2010

Я нашел хак, чтобы обойти проблему.Я не буду его использовать, потому что он действительно грязный, но, возможно, кому-то это нужно, поэтому:

  1. Не вызывайте службу WCF по обычному URL-адресу веб-приложения.Используйте URL-адрес центра администрирования (например, http://myserver:9999/_vti_bin/project/myservice.svc)
  2. Запустите часть, в которой вы изменяете Свойства фермы с повышенными привилегиями (SPSecurity.RunWithElevatedPrivileges).
  3. До расширенной части (теперь онаочень грязный) набор System.Web.HttpContext.Current.Items["FormDigestValidated"] = true;

Как я уже сказал, не очень хороший, но работает ...

0 голосов
/ 18 октября 2010

Учетные данные безопасности из вызывающего процесса, вероятно, скопированы. Вы можете настроить WCF независимо от того, делать это или нет.

См. http://msdn.microsoft.com/en-us/library/ms731925.aspx для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...