EF + UnitOfWork + SharePoint RunWithElevatedPrivileges - PullRequest
0 голосов
/ 30 ноября 2011

В нашем приложении SharePoint мы использовали шаблоны UnitOfWork + Repository вместе с Entity Framework. Чтобы избежать использования сквозной аутентификации, мы разработали фрагмент кода, который олицетворяет одного пользователя перед созданием экземпляра ObjectContext аналогичным образом, который описан в « Олицетворение пользователя с Entity Framework » в этом сайт.

Единственное различие между нашим кодом и упомянутым вопросом заключается в том, что для олицетворения мы используем RunWithElevatedPrivileges для олицетворения удостоверения пула приложений, как в следующем примере.

SPSecurity.RunWithElevatedPrivileges(delegate() { 
    using (SPSite site = new SPSite(url)) {
        _context = new MyDataContext(ConfigSingleton.GetInstance().ConnectionString);
    }
});

Мы поступили так, потому что ожидали, что создание ObjectContext после олицетворения и из-за того, что репозитории получают олицетворенную ObjectContext, решит наше требование.

К сожалению, это не так просто. На самом деле мы поняли, что даже если ObjectContext создается до и при обстоятельствах олицетворения, реальное соединение устанавливается непосредственно перед выполнением запроса, и поэтому не использует олицетворение , что нарушает наше требование.

Я проверил класс ObjectContext, чтобы увидеть, было ли какое-либо событие, через которое мы можем ввести олицетворение, но, к сожалению, ничего не нашло.

Любая помощь?

1 Ответ

1 голос
/ 30 ноября 2011

У нас была похожая проблема, когда мы использовали LinqToSharePoint.DataContext создается из HttpContext.Current и не учитывает метод RunWithElevatedPrivileges.Мы сделали неприятный обходной путь: мы создали резервную копию исходного HttpContext, создали новый фиктивный HttpContext в методе RunWithElevatedPrivileges, и проблема исчезла.Очевидно, что впоследствии мы устанавливаем исходный контекст.

Edit:

Вы можете использовать метод ниже, чтобы создать новый фиктивный 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);   
}
...