2009-07-18 74 views
3

我在SharePoint 2007中编写了两个功能。 一个作用域位于Site级别,它基本上将Web部件添加到激活的网站集。该功能部件部署在'bin'目录下。 其次是Farm作用域,这是我的自定义SPPersistedObject并部署在管理中心中。该程序集已添加到GAC。从Web部件更新SPPersistedObject时出错

从Web部件我需要更新我的自定义对象。这在大多数情况下工作正常。但是,遵循一些服务器上的最小特权管理域帐户“ http://technet.microsoft.com/en-us/library/cc263445.aspx”我提示以下错误:

System.Security.SecurityException: 访问被拒绝。在MyWebPart上的 Microsoft.SharePoint.Administration.SPPersistedObject.Update() 。 <> c__DisplayClass1.b__0() at Microsoft.SharePoint.SPSecurity.CodeToRunElevatedWrapper(Object state)at Microsoft.SharePoint.SPSecurity。 <> c__DisplayClass4.b__2()(CodeToRunElevated 安全码)在 Microsoft.SharePoint.SPSecurity.RunWithElevatedPrivileges(WaitCallback 安全码,对象PARAM) 在 Microsoft.SharePoint.Utilities.SecurityContext.RunAsProcess在 Microsoft.SharePoint.SPSecurity.RunWithElevatedPrivileges (CodeToRunElevated 的SecureCode)在 MyWebPart.RenderWebPart(HtmlTextWriter的 作家)的组件 失败的区域是:我的电脑

我是否需要设置任何权限或CAS政策,以防止这个错误?

下面是我为web部件组件设置的当前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> 

请指教。

问候, 贾格纳

回答

6

贾格纳,

您遇到的问题是由于这样的事实,对于数据的后备存储从SPPersistedObject派生类型是SharePoint场配置数据库。在最少特权安装中,除读取此数据库以外的任何内容的唯一帐户是服务器场服务(计时器服务)帐户。即使在您的代码中提升特权也只会将您的安全上下文“提升”到在IIS中运行该网站的应用程序池帐户的安全上下文。

我遇到你之前是这种情况,我只知道我有两种方法来解决它:

  1. 找到一种方法的上下文中运行的应用程序代码农场服务帐户。这通常转换为将代码作为自定义计时器作业运行。

  2. 调整场配置数据库权限以授予应用程序池帐户(假定在作为高级安全块的一部分运行时)写入权限。

在这两个选项中,只有第一个选项保持真正的“最低权限”执行原则......但它确实需要重新设计代码。

我一般都很好地创建了一个“扫描”自定义计时器作业,该作业被创建并计划在特征激活时运行。然后,该计时器作业将检查网站集(通常会扫描整个Web应用程序)以查看是否需要持久化,更新等属性。如果发现需要更新,则它们由计时器作业执行,因为它具有所需的访问权限水平。

的什么我描述一个功能,我拿出在CodePlex上(http://blobcachefarmflush.codeplex.com/SourceControl/changeset/view/53851#797787)出现一个例子。我需要更新SPWebApplication实例上的Properties包,唯一的方法是在计时器作业的上下文中进行。当用户从UI内的变化,一个标志置位在网站集的RootWeb的属性集合。定时作业,通过该网站集扫描,并且当它看到这样的标志设置,它需要进行从适当的安全上下文中进行必要的修改照顾。

我希望这有助于!

2
class MySett : SPPersistedObject 
{ 
    //... 
    protected override bool HasAdditionalUpdateAccess() { return true; } 
}