EF + UnitOfWork + SharePoint RunWithElevatedPrivileges
Posted
技术标签:
【中文标题】EF + UnitOfWork + SharePoint RunWithElevatedPrivileges【英文标题】: 【发布时间】:2011-11-30 14:30:42 【问题描述】:在我们的 SharePoint 应用程序中,我们将 UnitOfWork + Repository 模式与实体框架一起使用。为避免使用直通身份验证,我们开发了一段代码,在创建 ObjectContext
实例之前模拟单个用户,其方式与本网站“Impersonating user with Entity Framework”中描述的方式类似。
我们的代码和提到的问题之间的唯一区别是,为了进行模拟,我们使用RunWithElevatedPrivileges
来模拟应用程序池身份,如下例所示。
SPSecurity.RunWithElevatedPrivileges(delegate()
using (SPSite site = new SPSite(url))
_context = new MyDataContext(ConfigSingleton.GetInstance().ConnectionString);
);
我们这样做是因为我们希望在模拟之后创建ObjectContext
,并且由于存储库正在接收模拟的ObjectContext
将解决我们的要求。
不幸的是,这并不容易。事实上,我们体验到,即使ObjectContext
是在模拟情况之前和模拟情况下创建的,但真正的连接是在执行查询之前建立的,因此不使用模拟,这违反了我们的要求。
我检查了ObjectContext
类,看看是否有任何事件可以注入模拟,但不幸的是什么也没找到。
有什么帮助吗?
【问题讨论】:
【参考方案1】:我们在使用 LinqToSharePoint 时遇到了类似的问题。 DataContext 是从 HttpContext.Current 创建的,没有考虑 RunWithElevatedPrivileges 方法。我们做了一个令人讨厌的解决方法,我们备份了原始的 HttpContext,在 RunWithElevatedPrivileges 方法中创建了一个新的虚拟 HttpContext,问题就消失了。显然我们之后将上下文设置为原始的。
编辑:
您可以使用以下方法创建新的虚拟HttpContext
。在您的 RunWithElevatedPrivileges 中首先调用此方法。在正常上下文中,只需使用var backupContext = HttpContext.Current
备份您当前的上下文,然后在一切完成后将上下文设置回来。
private void SetNewContextWeb(SPWeb oWeb)
HttpRequest httpRequest = new HttpRequest(string.Empty, oWeb.Url, string.Empty);
HttpContext.Current = new HttpContext(httpRequest, new HttpResponse(new System.IO.StringWriter()));
SPControl.SetContextWeb(HttpContext.Current, oWeb);
【讨论】:
您能否详细说明您的解决方案?谢谢以上是关于EF + UnitOfWork + SharePoint RunWithElevatedPrivileges的主要内容,如果未能解决你的问题,请参考以下文章
AngularJs + WebApi + EF + SqlServer 一步一步搭建项目