我有两个网站集,我们只需要将它们称为A和B.在A中,我列出了一些内容,我希望在多个网站集中进行同步。我创建了一个自定义内容查询Web部件,用于查询数据,但我遇到了路障。
由于用户级帐户根本无法访问站点A,并且我不希望他们在任何级别访问此站点,因此当我的Web部件在站点B上运行时,我收到拒绝访问错误有没有办法改变RunWithElevatedPrivileges的工作环境?
我从网站集B运行的当前代码看起来像
ClientContext clientContext = new ClientContext(siteAUrl);
SP.List oList = clientContext.Web.Lists.GetByTitle(listName);
CamlQuery query = new CamlQuery();
//Add View, Execute Query, etc.
return results;
如果我将它包装在SPSecurity.RunWithElevatedPrivileges中,它会在网站集B上下文中提升运行,我希望它在网站集A上下文中运行。
答案 0 :(得分:4)
SharePoint 2010客户端对象模型不支持SPSecurity.RunWithElevatedPrivileges
。由于@Nat声明此调用将线程标识还原为应用程序池帐户(SystemAccount)。由于您的代码在客户端上运行 ,因此无法将身份还原到应用程序池帐户。
通过客户端对象模型将代码作为系统帐户运行会打开安全漏洞。每个人都可以作为管理员编写和执行代码。
如果您的代码在服务器上运行,您可以使用SPUserToken.SystemAccount
使用系统帐户凭据打开SPSite
:
using (SPSite site = new SPSite("http://someurl", SPUserToken.SystemAccount))
{
// admin action here
}
查看我的博文How to Open a SPSite with System Account Credentials以获取更多信息。
答案 1 :(得分:2)
请记住,SPSecurity.RunWithElevatedPrivileges正在运行应用程序池帐户的安全上下文中的代码。 因此,除非您在不同的Web应用程序中运行网站集,否则它们将具有相同的上下文。即所有被调查者的主人。
如果您正在跨网站集运行,则应用程序池帐户将指定其他Web应用程序的权限。