Při vytváření webové aplikace na SharePoint 2010 s anonymní přístupem jsem narazil jednu z mnoha nedokumentovaných vlastností SharePointu 2010, kdy po zapnutí anonymního přístupu přestal fungovat LINQ a začaly vznikat chyby při snaze přistupovat k seznamům právě pomocí těchto dotazů.
První pokus byl samozřejmě obalit tuto funkci zobrazující navigaci eskalací oprávnění na systémového uživatele pomocí funkce SPSecurity.RunWithElevatedPrivileges, to ale nikam nevedlo a Linq nepřevzal oprávnění.
Nebyl jsem samozřejmě první kdo na to narazil, našel jsem jeden post, který to řeší:
[more]
http://jcapka.blogspot.com/2010/05/making-linq-to-sharepoint-work-for.html
Takto:
public static class AnonymousContextSwitch
{
public static void RunWithElevatedPrivelligesAndContextSwitch(
SPSecurity.CodeToRunElevated secureCode)
{
try
{
//If there is a SPContext.Current object and there is no known user,
// we need to take action
bool nullUser = (SPContext.Current != null &&
SPContext.Current.Web.CurrentUser == null);
HttpContext backupCtx = HttpContext.Current;
if (nullUser)
HttpContext.Current = null;
SPSecurity.RunWithElevatedPrivileges(secureCode);
if (nullUser)
HttpContext.Current = backupCtx;
}
catch (Exception ex)
{
string errorMessage = "Error running code in null http context";
//Use your favourite form of logging to log the error message and exception ....
}
}
}
Toto řešení sice funguje, je ale potřeba si rozhodnout, zda je to na aktuálním projektu bezpečné a co přesně pod tímto oprávněním anonymní uživatel může provádět, pokud pouze číst informace (kde nejsou důvěrné informace řešeny formou oprávnění), tak je to možná pro některé případy použitelné. Lepší způsob ale je buď vůbec LINQ nepoužít (což už u hotového projektu lze jen obtížně), nebo vytvořit nového uživatele v SP s omezeným oprávněním a předávat jeho kontext při inicializaci objektu SPSite, tedy mírně zmodifikovat výše uvedenou třídu AnonymousContextSwitch tak, aby se kontext vytvořil pro tohoto uživatele s nízkým oprávněním.