Ich habe das starke Gefühl, dass die Verwendung von SharePoint RunWithElevatedPrivileges
wie die Pest vermieden werden sollte, aber einige andere davon überzeugen müssen, warum. Hier ist, was ich habe.
Gründe, den Fall in zwei Kategorien zu heben:
Für Ersteres ist es viel besser, den SPSite-Identitätswechsel zu verwenden. Letzteres ist der einzige Grund, warum ich RWEP benutze.
Um zu verdeutlichen, erzeugt RWEP keinen neuen Thread. Stattdessen verwendet es Win32-APIs, um die Identität des aktuellen Threads zurück in die Prozessidentität (Deaktivieren des Identitätswechsels) zu versetzen, um den erhöhten Code auszuführen, und anschließend den Identitätswechsel wieder einzuschalten, um die Arbeit für den aktuellen Benutzer fortzusetzen. Dies hat mehrere Auswirkungen:
Und wie Alex schon gesagt hat, erben die Kinder einer SPSite ihre Berechtigungen von der SPSite, die wiederum ihre Berechtigungen bei der Erstellung hat. Daher verhält sich SPContext.Current.Site immer noch mit den Berechtigungen des aktuellen Benutzers, selbst wenn Sie in Ihrem CodeToRunElevated darauf verweisen. Stattdessen müssten Sie eine neue SPSite innerhalb des erhöhten Blocks erstellen und konsumieren.
Um es zusammenzufassen: RWEP, um den App-Pool außerhalb von SharePoint zu verfälschen, SPSite-Identitätswechsel, um die Identität des App-Pools in SharePoint anzunehmen.
1) Eine substantielle Verwendung von RWEP ist ein guter Hinweis auf Code-Gerüche. Es kann leicht ohne Gedanken missbraucht werden, was zu ernsthaften Sicherheitsproblemen führt. Viele Entwickler denken nicht darüber nach, was Benutzer mit der Macht tun könnten, die ihnen indirekt "unter die Haube" gegeben wird.
Nur ein Beispiel: Es ist wichtig, ValidateFormDigest aufzurufen, bevor Sie RBEP verwenden, um bösartige Anfragen in Anwendungsseiten zu verhindern .
2) SPWeb- und SPSite-Objekte müssen im Kontext von RWEP erstellt werden. Dies ist für Anfänger leicht zu vergessen und führt zu vielen Frustrationen.
Diese Einschränkung bedeutet auch, dass alle Arbeiten und alle Objekte, die von diesen Objekten erstellt wurden, vor dem Ende des RWEP-Delegaten verwendet und beendet werden müssen. Dies ist ein weiterer häufiger Fehler.
Keith Dahlby hat Erweiterungsmethoden geschrieben, um diese Probleme zu umgehen lesbarer Code.
RWEP hat wie alles andere Vor- und Nachteile.
Wenn Sie Bedenken haben, dass Endbenutzer RWEP ausführen, haben Sie wahrscheinlich bereits ein größeres Problem, da dieser Code bereits auf GAC installiert wurde.
Manchmal müssen Sie einfach dabei bleiben: Betrachten Sie einen Benutzer, der keine Administratorrechte hat und einen Dokumenten-Workflow ausführt. Nachdem dieser Benutzer ihn genehmigt (oder abgelehnt hat), sollte Ihre Workflow-Engine diese SPListItem-Berechtigungen neu definieren können.
Ich benutze es und finde es sehr nützlich. Meiner Ansicht nach möchte ich, dass der Benutzer meinen Code ausführt und dass der Code Dinge tut, die der Benutzer normalerweise nicht tun kann. Sie können etwas absperren und den Benutzer trotzdem sehr kontrolliert darauf zugreifen lassen.
Tags und Links asp.net sharepoint elevated-privileges sharepoint-2007 asp.net-3.5