Ошибка обновления SPPersistedObject из веб-части - PullRequest
3 голосов
/ 18 июля 2009

Я написал две функции в SharePoint 2007. Один из них находится на уровне сайта и в основном добавляет веб-часть в семейство сайтов, где он активируется. Эта сборка компонентов развернута в каталоге 'bin'. Второй - это область действия фермы, которая является моим пользовательским SPPersistedObject и развернута в центре администрирования. Сборка добавлена ​​в GAC.

Из веб-части мне нужно обновить свой пользовательский объект. Это работает нормально в большинстве случаев. Но на некоторых серверах, которые используют учетные записи домена администрирования с наименьшими привилегиями http://technet.microsoft.com/en-us/library/cc263445.aspx' Я получаю сообщение об ошибке ниже

System.Security.SecurityException: Доступ закрыт. в Microsoft.SharePoint.Administration.SPPersistedObject.Update () на MyWebPart. <> c__DisplayClass1.b__0 () в Microsoft.SharePoint.SPSecurity.CodeToRunElevatedWrapper (Объект состояние) в Microsoft.SharePoint.SPSecurity. <> C__DisplayClass4.b__2 () в Microsoft.SharePoint.Utilities.SecurityContext.RunAsProcess (CodeToRunElevated secureCode) в Microsoft.SharePoint.SPSecurity.RunWithElevatedPrivileges (WaitCallback secureCode, Object param) в Microsoft.SharePoint.SPSecurity.RunWithElevatedPrivileges (CodeToRunElevated secureCode) в MyWebPart.RenderWebPart (HtmlTextWriter писатель) Зона собрания, которое не удалось: MyComputer

Нужно ли устанавливать какие-либо разрешения или политики CAS для предотвращения этой ошибки?

Ниже приведен мой текущий набор политик CAS для сборки веб-части. Нужно ли мне вносить какие-либо изменения здесь.

<CodeAccessSecurity>
    <PolicyItem>
      <PermissionSet class="NamedPermissionSet" version="1" Name="MyPermission" Description="Permission set for my solution">
        <IPermission class="System.Web.AspNetHostingPermission, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Level="Medium"   />
        <IPermission class="System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true" />
        <IPermission class="System.Security.Permissions.EnvironmentPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true" />
        <IPermission class="System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Flags="AllFlags" />
        <IPermission class="Microsoft.SharePoint.Security.WebPartPermission, Microsoft.SharePoint.Security, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" version="1" Connections="true"  />
        <IPermission class="Microsoft.SharePoint.Security.SharePointPermission, Microsoft.SharePoint.Security, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"  version="1" ObjectModel="true" UnsafeSaveOnGet="true" Impersonate="true"/>
        <IPermission class="System.Net.WebPermission, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true">
          <ConnectAccess>
            <URI uri="$OriginHost$"/>
            <URI uri="http://.*\.xyz\.com/.*"/>
          </ConnectAccess>
        </IPermission>
      </PermissionSet>
      <Assemblies>
        <Assembly Name="MyWebPart" Version="1.0.0.0" PublicKeyBlob="0024000004800000940000000602000000240000525341310004000001000100df0e85cb8c660241cd3225eb653a590b91303ddbd37f8f1e661d2dffb840a258b899d6bacbbc55d03768d5ea0260ee4c8341fd447d7200abdb74b837733c3f756833e169cae803aef808530dd3ddad953a49492faee3eeba6f0dba66b0d66f1f9ca5266c69dcb799ed364db5e9e6ebcd4e81fb27365de962cbe6e7e7fba300dc"/>
      </Assemblies>
    </PolicyItem>
  </CodeAccessSecurity>

Пожалуйста, совет.

С уважением, Джаганнатха

Ответы [ 2 ]

6 голосов
/ 21 июля 2009

Джаганнатха,

Проблема, с которой вы сталкиваетесь, связана с тем, что резервное хранилище данных из типов SPPersistedObject является базой данных конфигурации фермы SharePoint. При установке с наименьшими правами единственная учетная запись, которая имеет что-либо кроме доступа для чтения к этой базе данных, является учетной записью службы фермы (службы таймера). Даже повышение привилегий в вашем коде только «поднимет» ваш контекст безопасности до уровня учетной записи пула приложений, под которой сайт работает в IIS.

Я сталкивался с ситуацией, в которой вы были раньше, и я знаю только два способа обойти это:

  1. Найдите способ запуска кода приложения в контексте учетной записи службы фермы. Обычно это приводит к запуску кода в качестве задания таймера.

  2. Настройте разрешения базы данных конфигурации фермы, чтобы предоставить учетной записи пула приложений (предполагается, что она запускается как часть блока повышенной безопасности).

Из этих двух вариантов только первый параметр остается верным принципу выполнения "наименьших привилегий" ... но он влечет за собой повторную архитектуру вашего кода.

У меня, как правило, было хорошее создание пользовательского задания таймера «развертки», которое было создано и запланировано для запуска во время активации функции. Затем это задание таймера проверяет семейство сайтов (обычно охватывающее все веб-приложение), чтобы определить, нужно ли сохранять свойства, обновлять их и т. Д. Если оно находит, что обновления необходимы, они выполняются заданием таймера, поскольку оно имеет требуемый доступ. уровень.

Пример того, что я описываю, появляется в компоненте, который я выпустил в CodePlex (http://blobcachefarmflush.codeplex.com/SourceControl/changeset/view/53851#797787). Мне нужно было обновить пакет свойств в экземпляре SPWebApplication , и это единственный способ Это было сделано в контексте задания таймера. Когда пользователь вносит изменения в пользовательском интерфейсе, устанавливается флаг в коллекции свойств RootWeb семейства сайтов. Задание таймера перемещается по семейству сайтов, и когда оно видит такое флаг установлен, он заботится о внесении необходимых изменений из соответствующего контекста безопасности.

Надеюсь, это поможет!

2 голосов
/ 08 февраля 2013
class MySett : SPPersistedObject
{
    //...
    protected override bool HasAdditionalUpdateAccess() { return true; }
}
...