Techblog

Herzlich Willkommen im Communardo Techblog, dem Entwickler-Weblog von Communardo. An dieser Stelle werden Ideen, Problemlösungen, Tipps und Problemstellungen rund um die Entwicklung webbasierter Software vorgestellt.

techblog-teaser

SharePoint 2010: Der Termstore und der priviligierte Nutzer

, von
1 Kommentar

Mit SharePoint 2010 trat erstmalig der Managed Metadata Service (MMS) in unser Leben. Mit Hilfe des SharePoint MMS können (gemanagte) Metadaten und ContentTypes verwaltet werden. ContentTypes im Sinne von ContentType Hub Steuerung.

Die Verwendung des Services über das Object Model gestaltet sich relativ einfach. Sofern der User, unter welchem der Code ausgeführt wird, Zugriffsrechte auf den Termstore besitzt, bewegt man sich im grünen Bereich. Was passiert aber wenn versucht wird, Änderungen am TermStore automatisch vornehmen zu wollen, ohne dafür Rechte zu besitzen? Natürlich, wir geben dem entsprechenden Nutzer die Rechte im TermStore … oder aber wir verwenden RunWithElevatedPrivileges. Dazu sollte man wissen, dass der privilegierte Nutzer in dem Fall ebenfalls als Administrator für den TermStore gesetzt sein muss.

<span id="more-5710"></span>SPSecurity.RunWithElevatedPrivileges(() =>
{
  using (var site = new SPSite(Url))
  {
    var session = new TaxonomySession(site);
    var termStore = session.DefaultSiteCollectionTermStore;
    var siteCollectionGroup = termStore.GetSiteCollectionGroup(site);
    var termSet = group.CreateTermSet(name, new Guid(id));
    termStore.CommitAll();
  }
});

Das Ergebnis dieser kurzen Befehlsabfolge ist folgende Exception:

System.UnauthorizedAccessException was caught
Message=The current user has insufficient permissions to perform this operation.
Source=Microsoft.SharePoint.Taxonomy

Warum? Offensichtlich ist alles richtig konfiguriert worden. Der privilegierte Nutzer besitzt Berechtigung um auf den MMS zuzugreifen, ist TermStore Administrator und eine manuelle Anmeldung verlief ebenfalls erfolgreich. Warum werden wir dann mit dieser Fehlermeldung konfrontiert?

Die Ursache für dieses Problem lässt sich im SharePoint Quellcode vermuten. Der Grund ist folgender: Nutzer Testnutzer meldet sich am System an. Dieser besitzt keine Rechte, Terms anzulegen oder zu verändern. Er startet den Prozess, welcher über den privilegierten Nutzer auf den TermStore zugreifen möchte.

Das Codestück „var session = new TaxonomySession(site)“ lässt vermuten, dass eine „privilegierte Session“ gestartet wird. In Wirklichkeit öffnet SharePoint die Session, aber nicht mit den Rechten des privilegierten Nutzers, sondern benutzt den Nutzer des aktuellen Kontexts = Testnutzer.

Die Lösung ist nicht schön aber funktioniert:

try
{
    oldContext = HttpContext.Current;
    HttpContext.Current = null; 
}
finally
{
   HttpContext.Current = oldContext;
}

Die Lösung ist recht einfach. Bevor die Taxonomy Session aufgebaut wird muss der aktuelle Nutzer aus dem Kontext gelöscht werden. Dies geschieht am einfachsten durch Löschen des Kontexts. Findet der SharePoint Quellcode den aktuellen Nutzer nicht, so wird der Nutzer der übergebenen Site verwendet. Das ist genau das Verhalten, was wir uns gewünscht hatten.

Der Code wird nun bis zum Ende abgearbeitet ohne eine Exception. Es sollte darauf geachtet werden, dass der Kontext im finally Abschnitt wiederhergestellt wird.

Artikel als PDF speichern
Eine Antwort zu:
“SharePoint 2010: Der Termstore und der priviligierte Nutzer”
  1. Phillip
    10. Oktober 2012, 06:23 Uhr

    Das ist gut. Danke!

Schreiben Sie einen Kommentar

*

Diese Webseite basiert auf Wordpress. © 2014 Communardo Software GmbH / Kleiststraße 10 a / D-01129 Dresden / Fon +49 (0) 351/8 33 82-0 / info@communardo.de