Jag*_*ath 3 security sharepoint web-parts
我在SharePoint 2007中编写了两个功能.一个是在站点级别的范围,它基本上将Web部件添加到激活它的网站集.此功能部件部署在"bin"目录下.其次是Farm scoped,它是我的自定义SPPersistedObject,并部署在管理中心.该程序集已添加到GAC.
从Web部分我需要更新我的自定义对象.在大多数情况下,这样做很好.但在一些服务器上遵循最小权限管理域帐户' http://technet.microsoft.com/en-us/library/cc263445.aspx '我得到以下错误
System.Security.SecurityException:访问被拒绝.在Microsoft.SharePoint.Administration.SPPersistedObject.Update()at MyWebPart.<> c__DisplayClass1.b__0()at Microsoft.SharePoint.SPSecurity.CodeToRunElevatedWrapper(Object state)at Microsoft.SharePoint.SPSecurity.<> c__DisplayClass4.b__2()at Microsoft位于Microsoft.SharePoint.SPSecurity.RunWithElevatedPrivileges(CodeToRunElevated secureCode)的MyWebPart.RenderWebPart(HtmlTextWriter writer)的Microsoft.SharePoint.SPSecurity.RunWithElevatedPrivileges(WaitCallback secureCode,Object param)上的.SharePoint.Utilities.SecurityContext.RunAsProcess(CodeToRunElevated secureCode)失败的程序集是:MyComputer
我是否需要设置任何权限或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>
Run Code Online (Sandbox Code Playgroud)
请指教.
此致,Jagannath
贾甘,
您遇到的问题是由于来自SPPersistedObject -derived类型的数据的后备存储是SharePoint场配置数据库.在最低权限安装中,除了对此数据库具有读访问权限之外的唯一帐户是服务器场服务(计时器服务)帐户.即使提升代码中的权限,也只会将安全上下文"提升"到IIS中运行该站点的应用程序池帐户.
我遇到过你以前的情况,我只知道两种解决方法:
找到一种在服务器场帐户的上下文中运行应用程序代码的方法.这通常转换为将代码作为自定义计时器作业运行.
调整服务器场配置数据库权限以授予应用程序池帐户(在作为提升的安全性块的一部分运行时假定)写入访问权限.
在这两个选项中,只有第一个选项符合"最小特权"执行原则......但它确实需要重新构建代码.
我通常很好地创建了一个"扫描"自定义计时器作业,该作业被创建并计划在功能激活时运行.该计时器作业然后检查网站集(通常扫描整个Web应用程序)以查看是否需要保留,更新等属性.如果它发现需要更新,则它们由计时器作业执行,因为它具有所需的访问权限水平.
我正在描述的一个例子出现在我在CodePlex上发布的一个功能中(http://blobcachefarmflush.codeplex.com/SourceControl/changeset/view/53851#797787).我需要在SPWebApplication实例上更新Properties包,唯一的方法是在计时器作业的上下文中.当用户在UI中进行更改时,会在网站集的RootWeb的Properties集合上设置标志.计时器作业会扫描网站集,当它看到这样的标记集时,它会负责从适当的安全上下文进行必要的更改.
我希望这有帮助!