EF + UnitOfWork + SharePoint RunWithElevatedPrivileges

时间:2011-11-30 14:30:42

标签: entity-framework sharepoint sharepoint-2010 impersonation

在我们的SharePoint应用程序中,我们将UnitOfWork + Repository模式与Entity Framework一起使用。为了避免使用直通身份验证,我们开发了一段代码,用于在创建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 个答案:

答案 0 :(得分: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);   
}