SharePointCommunity
Die deutschsprachige SharePoint Community für SharePoint 2013, 2010, Office 365 und Yammer


SharePoint Security - Teil 4: Berechtigungen und Vererbung

Blogs

Fabian´s Blog [SharePoint MVP]

Syndication

Weitere Artikel dieser Serie:

Im Anschluss an den Artikel zur Einführung der Bedeutung und Repräsentation von Benutzern und Gruppen innerhalb einer Site Collection möchte ich heute beschreiben, wie diese Benutzeridentitäten berechtigt werden können.

Zur Einführung in dieses Thema möchte ich erst einmal den Betriff „Berechtigung“ ein wenig auseinander nehmen. Was bedeutet eigentlich Berechtigung? Eine Berechtigung ergibt sich aus einem speziellen Recht, dass eine Identität (Benutzer) für ein abzusicherndes SharePoint-Objekt erhält. SharePoint kennt 32 unterschiedliche Rechte auf Listen- und Websiteebene (zum Beispiel „Elemente hinzufügen“ oder „Berechtigungen verwalten“). Der Zugriff auf SharePoint-Objekte bzw. Funktionen wird über diese Rechte gesteuert. Eine einfache Windows SharePoint Services-Website enthält fünf Standardberechtigungsstufen.


Eine Berechtigungsstufe wird über das SPRoleDefinition-Objekt repräsentiert. Im Zusammenspiel mit der SPRoleAssignment-Klasse kann ein Benutzer oder eine Gruppe für ein definiertes SharePoint-Objekt berechtigt werden. Abzusichernde SharePoint-Objekte sind zum Beispiel Websitesammlungen, Websites, Listen, Bibliotheken, Ordner und auch einzelne Listeelemente. Rechte werden in sogenannten Berechtigungsstufen zusammengefasst. Folgendes Beispiel veranschaulicht die explizite Berechtigung eines Benutzers für eine Site Collection.

SPWeb currentWeb = SPContext.Current.Web;
            
// Rollendefinition für das Berechtigungslevel "Lesen" erzeugen
SPRoleDefinition roleDefinitionRead = currentWeb.RoleDefinitions["Lesen"];
 
// Erstellung eines neues SPRoleAssignment-Objekts            
SPRoleAssignment roleAssignment = new SPRoleAssignment("CONTOSO\\UserC", "userc@contoso.de", "User C", "");

// Dem neuen RoleAssignment die Berechtigungsstufe hinzufügen
roleAssignment.RoleDefinitionBindings.Add(roleDefinitionRead);

// Das RoleAssignment der Website explizit hinzufügen
currentWeb.RoleAssignments.Add(roleAssignment);


Als Ergbnis diese Programmcodes wird der Benutzer explizit für ein SharePoint-Objekt (in diesem Fall eine Site Collection) berechtigt. Dieses Verfahren kann analog auch auf Websites, Listen oder Listenelemente angewandt werden. Noch ein kleiner Tipp: Sollte der Benutzer zu mehreren RoleDefinitions hinzugefügt werden, ergeben sich seine effektiven Berechtigungen aus der Gesamtmenge aller Rechte.

Alternativ zur expliziten Berechtigung besteht die Option, ein Benutzerkonto zu einer SharePoint-Gruppe hinzuzufügen. Eine einfache SharePoint-Website integriert vier Standardgruppen: Besitzer, Teilnehmer, Mitglieder und Leser, die zu einer Standard-Berechtigungsstufe zugewiesen sind. Wie ein Benutzer einer SharePoint-Gruppe hinzugefügt und somit für eine Webseite implizit berechtigt werden kann, zeigt das folgende Beispiel:

SPWeb currentWeb = SPContext.Current.Web;

// Erstellung einer neuen SharePoint-Gruppe
currentWeb.SiteGroups.Add("Neue Gruppe", currentWeb.CurrentUser, currentWeb.CurrentUser, "");
SPGroup newGroup = currentWeb.SiteGroups["Neue Gruppe"];

// Erzeugung eines neuen SPUser-Objekts
SPUser userB = currentWeb.AllUsers["CONTOSO\\UserB"];

// Benutzer der Gruppe hinzufügen
newGroup.AddUser(userB);


Die aktuelle Version der Windows SharePoint Services integriert eine neue Funktion, die die Suche und Auswahl von Benutzerkonten für die Berechtigungsvergabe erleichtert: den People Picker. Der People Picker ist ein integriertes Web Server Control, das in eine beliebige Anwendung integriert und über die PeopleEditor-Klasse implementiert werden kann.


Der PeopleEditor ist recht einfach zu bedienen. Neben der Möglichkeit, dem Control eine Reihe von Einstellungen mitzugeben, können nach Auswahl von Benutzerkonten die Liste der ausgewählten Einträge über die ResolvedEntities-Eigenschaft iteriert und ggf. weiterverarbeitet werden. Folgendes Codebeispiel veranschaulicht die Verwendung des People Pickers.

PeopleEditor peoplePicker = new PeopleEditor();

...

PickerEntity pickerEntity = (PickerEntity)peoplePicker.ResolvedEntities[0];
string loginName = peoplePicker.Accounts[0].ToString();
string displayName = pickerEntity.EntityData["DisplayName"].ToString();
if (string.IsNullOrEmpty(displayName))
{
       displayName = loginName;
}

string email = pickerEntity.EntityData["Email"] != null ? pickerEntity.EntityData["Email"].ToString() : String.Empty;
string notes = String.Format("Benutzerkonto wurde am {0} erstellt.", DateTime.Now.ToString());

// Rollendefinition der Teilnehmer
SPRoleDefinition roleContribute = currentWeb.RoleDefinitions["Teilnehmen"];

SPRoleAssignment roleAssignment = new SPRoleAssignment(loginName, email, displayName, notes);
roleAssignment.RoleDefinitionBindings.Add(roleContribute);
currentWeb.RoleAssignments.Add(roleAssignment);


Kommen wir zurück zum Begriff der Berechtigung und werfen noch einmal einen genaueren Blick auf die abzusichernden SharePoint-Objekte. SharePoint liefert sehr flexible Möglichkeiten, Objekte (Webites, Dokumentenbibliotheken, Listen oder Listenelemente) innerhalb einer SharePoint-Websitesammlung abzusichern. Jedes dieser Elemente enthält eine Access Control List (ACL), die zur Laufzeit die Rechte des aktuell angemeldeten Benutzers überprüft. In der Standardeinstellung besitzt jeweils nur die Top Level Website einer Websitesammlung eine Access Control List. Alle untergeordneten Elemente (Websites, Listen und Elemente) erben die darin definierten Einstellungen. Dieses Verfahren macht die Vergabe von Berechtigungen zunächst einmal sehr einfach, da nur die oberste Ebene berücksichtige werden muss. In einigen Umgebungen kann es jedoch erforderlich sein, ein Element innerhalb einer SharePoint-Website granularer zu berechtigen. Für diese Anforderung stellt SharePoint die Möglichkeit bereit, die Berechtigungsvererbung aufzubrechen. Nachfolgendes Beispiel zeigt, wie die Berechtigungsvererbung für eine Dokumentenbibliothek aufgebrochen wird und danach eine SharePoint-Gruppe explizit für diese Bibliothek ein neues Recht erhält.

SPWeb currentWeb = SPContext.Current.Web;

// Zugriff auf die Dokumentenbibliothek über die GetListFromUrl-Methode
SPDocumentLibrary docLib = (SPDocumentLibrary)currentWeb.GetListFromUrl(currentWeb.Url + "/Dokumente/Forms/AllItems.aspx");

SPGroup groupReader = currentWeb.Groups["Mitglieder von Security Demo"];
SPRoleAssig nment roleAssignmentReaderGroup = new SPRoleAssignment(groupReader);
SPRoleDefinition roleDefRead = currentWeb.RoleDefinitions["Lesen"];
roleAssignmentReaderGroup.RoleDefinitionBindings.Add(roleDefRead);

// Berechtigungsvererbung aufbrechen und die Rollenzuweisungen nicht kopieren
docLib.BreakRoleInheritance(false);

// Rollenzuweisung für die SharePoint-Gruppe hinzufügen
docLib.RoleAssignments.Add(roleAssignmentReaderGroup);
docLib.Update();


Über die Methode BreakRoleInheritance wird die Berechtigungsvererbung vom übergeordneten Element (in diesem Fall der Website) aufgebrochen. Der Methodenparameter legt fest, ob die Access Control List des übergeordneten Elements auf das aktuelle Objekt kopiert, also die Rollenzuweisungen übernommen, oder eine neue, leere ACL erstellt werden soll. Im vorliegenden Beispiel wird eine neue Access Control List erzeugt, wonach die namentlich zugewiesene SharePoint-Gruppe „Mitglieder von Security Demo“ für die Dokumentenbibliothek ein Leserecht erhält. Sollte der Urzustand der Vererbung wiederhergestellt werden, kann die Methoden ResetRoleInheritance zur Hilfe genommen werden.

In einigen Anwendungsfällen kann es erforderlich sein, Funktionen innerhalb eines SharePoint-Webparts abhängig von den Rechten des ausführenden Benutzers bereitzustellen. Für diese Anforderung integriert das SharePoint-Objektmodell die Funktion, Rechte eines Benutzers zur Laufzeit abzuprüfen. Das letzte Beispiel dieses Artikels demonstriert dieses Verfahren.

SPSite currentSite = SPContext.Current.Site;

SPUser impersonatedUser = currentWeb.SiteUsers["CONTOSO\\UserB"];

// Zugriff auf eine Websiteammlung im Kontext eines impersonifizierten Benutzers
using (SPSite impersonatedSite = new SPSite(currentSite.ID, impersonatedUser.UserToken))
{
// Verhindert die erneute Authentifizierung bei DoesUserHavePermissions
          impersonatedSite.CatchAccessDeniedException = false;

foreach (SPWeb web in impersonatedSite.RootWeb.Webs)
          {
            if (web.DoesUserHavePermissions(SPBasePermissions.ManageWeb))
                    {
                        // Der Benutzer besitzt das ManageWeb Recht
                    }
}
}      


Die Methode DoesUserHavePermissions prüft für ein SharePoint-Objekt nach einem expliziten Recht, wobei die abzuprüfenden Rechte bitweise verknüpft werden können. Die SPBasePermission-Enumeration spezifiziert alle Built-in Rechte einer SharePoint-Website. Die beschriebenen Methoden zur Unterbrechung oder Zurücksetzung der Berechtigungsvererbung, sowie zur Überprüfung von speziellen Rechten für ein definiertes Objekt können für alle abzusichernden SharePoint-Elemente angewandt werden.

Nach diesem etwas ausführlicher gehaltenen Artikel zum Thema Benutzer, Gruppen und Berechtigungen möchte ich im vorerst letzten Artikel dieser Serien die Möglichkeiten für Backup und Recovery unter die Lupe nehmen.


Bereitgestellt 16 Apr 2009 9:08 von Fabian Moritz