Impersonation durch RunWithElevatedPrivileges
Das Sicherheitskonzept von SharePoint beinhaltet, dass Code (z.B. innerhalb von WebParts) immer im Kontext des aktuell angemeldeten Benutzers ausgeführt wird. Da kann gerade für Entwickler, die mit Administratorrechten entwickeln und testen, eine Stolperfalle werden. Wenn z.B. ein Benutzer mit Leserechten den Code aufruft, im Code aber Aktionen ausgeführt werden sollen, die Schreibrechte benötigen, bekommt er eine sog. Access Denied Exception und wird vom Server zurückgewiesen. Der Mechanismus, diese Falle zu umgehen wird Impersonation genannt.
Hinter Impersonation steckt die Idee, während der Ausführung des Codes, in die Rolle eines anderen Benutzers (i.d.R. mit höheren Rechten) zu schlüpfen und bestimmte Codeteile dann damit auszuführen. Während dies unter SharePoint 2003 ziemlich mühselig und auch wenig ausgereift zu realisieren war, bietet das SharePoint Services 3.0 Objektmodell eine wesentlich einfachere Variante:
Die Klasse SPSecurity bietet eine Methode RunWithElevatedPrivileges, die eine solche Impersonation zur Verfügung stellt. Folgendes Codebeispiel soll das Prinzip veranschaulichen:
SPWeb web = SPControl.GetContextWeb(Context);
SPSecurity.RunWithElevatedPrivileges(delegate()
{
using (SPSite site = new SPSite(web.Site.ID))
{
// folgender Code wird mit der Berechtigung des Systemaccounts ausgeführt
}
});
Wichtig ist hierbei, dass ein neues SPSite Objekt erzeugt wird und nicht das über den Kontext aufgerufene Objekt benutzt wird. Dies (und auch alle darüber aufgerufenen Listen oder Dokumente) läuft nämlich immer mit der Berechtigung des aktuell angemeldeten Benutzers.