Communardo Software GmbH, Kleiststraße 10 a, D-01129 Dresden
0800 1 255 255

SharePoint 2010: Der Termstore und der priviligierte Nutzer

Mit SharePoint 2010 trat erst­ma­lig der Managed Metadata Service (MMS) in unser Leben. Mit Hilfe des SharePoint MMS kön­nen (gema­nagte) Metadaten und ContentTypes ver­wal­tet wer­den. ContentTypes im Sinne von ContentType Hub Steuerung.

Die Verwendung des Services über das Object Model gestal­tet sich rela­tiv ein­fach. Sofern der User, unter wel­chem der Code aus­ge­führt wird, Zugriffsrechte auf den Termstore besitzt, bewegt man sich im grü­nen Bereich. Was pas­siert aber wenn ver­sucht wird, Änderungen am TermStore auto­ma­tisch vor­neh­men zu wol­len, ohne dafür Rechte zu besit­zen? Natürlich, wir geben dem ent­spre­chen­den Nutzer die Rechte im TermStore … oder aber wir ver­wen­den RunWithElevatedPrivileges. Dazu sollte man wis­sen, dass der pri­vi­le­gierte Nutzer in dem Fall eben­falls als Administrator für den TermStore gesetzt sein muss.

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 die­ser kur­zen Befehlsabfolge ist fol­gende Exception:

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

Warum? Offensichtlich ist alles rich­tig kon­fi­gu­riert wor­den. Der pri­vi­le­gierte Nutzer besitzt Berechtigung um auf den MMS zuzu­grei­fen, ist TermStore Administrator und eine manu­elle Anmeldung ver­lief eben­falls erfolg­reich. Warum wer­den wir dann mit die­ser Fehlermeldung kon­fron­tiert?

Die Ursache für die­ses Problem lässt sich im SharePoint Quellcode ver­mu­ten. Der Grund ist fol­gen­der: Nutzer Testnutzer mel­det sich am System an. Dieser besitzt keine Rechte, Terms anzu­le­gen oder zu ver­än­dern. Er star­tet den Prozess, wel­cher über den pri­vi­le­gier­ten Nutzer auf den TermStore zugrei­fen möchte.

Das Codestück "var ses­sion = new TaxonomySession(site)" lässt ver­mu­ten, dass eine "pri­vi­le­gierte Session" gestar­tet wird. In Wirklichkeit öff­net SharePoint die Session, aber nicht mit den Rechten des pri­vi­le­gier­ten Nutzers, son­dern benutzt den Nutzer des aktu­el­len Kontexts = Testnutzer.

Die Lösung ist nicht schön aber funk­tio­niert:

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

Die Lösung ist recht ein­fach. Bevor die Taxonomy Session auf­ge­baut wird muss der aktu­elle Nutzer aus dem Kontext gelöscht wer­den. Dies geschieht am ein­fachs­ten durch Löschen des Kontexts. Findet der SharePoint Quellcode den aktu­el­len Nutzer nicht, so wird der Nutzer der über­ge­be­nen Site ver­wen­det. Das ist genau das Verhalten, was wir uns gewünscht hat­ten.

Der Code wird nun bis zum Ende abge­ar­bei­tet ohne eine Exception. Es sollte dar­auf geach­tet wer­den, dass der Kontext im finally Abschnitt wie­der­her­ge­stellt wird.

Related Posts

1 Kommentar

Comments are closed.

Pin It on Pinterest