SharePoint 2010 + Linq + anonymní uživatel

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í.

image

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.

SharePoint: This page contains content or formatting that is not valid. You can find more information in the affected sections

Tuto pěknou chybu způsobují validátory použité ve vlastní webpartě, chyba vzniká pouze pokud se jedná o stránku pro publikování (publishing page).

SharePoint z neznámého důvodu spustí validace na webpartě při ukládání stránky a nedovolí stránku uložit pokud validace ovládacích prvků neprojde v pořádku. Na tom by nebylo nic divného pokud není specifikovaný atribut ValidationGroup a měla by se kontrolovat logicky celá stránka, ale SharePoint kontroluje validaci i na ovládacích prvcích kde je ValidationGroup specifikovaný.

Na lepší způsob než níže uvedený jsem zatím nepřišel, kdy vypínám validace v případě, že aktuální stránka je v editačním módu:

protected override void CreateChildControls()
{

     // some code

     if (SPContext.Current.FormContext.FormMode == SPControlMode.Edit || 
        SPContext.Current.FormContext.FormMode == SPControlMode.New)

     {
            validator.Enabled = false;
     }

}