【问题标题】:EF + UnitOfWork + SharePoint RunWithElevatedPrivilegesEF + 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 类,看看是否有任何事件可以注入模拟,但不幸的是什么也没找到。

有什么帮助吗?

【问题讨论】:

    标签: entity-framework sharepoint sharepoint-2010 impersonation


    【解决方案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);   
    }
    

    【讨论】:

    • 您能否详细说明您的解决方案?谢谢
    猜你喜欢
    • 2012-05-16
    • 2012-01-19
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    相关资源
    最近更新 更多