Frage

Ich habe eine Anforderung, immer den angemeldeten Benutzer zu erhalten.

Das Objekt Der Anrufprozess wird passieren, ist das Spweb.

Da dies der Legacy-Code ist, kann ich nicht ändern, was die anrufenden Prozesse durchschicken, und hier ist das Problem: Einige von ihnen passieren in dem Spwweb, der so läuft, und einige senden in einem SPWEB, das in erhöhten Privelegien ist.Für die erhöhten Priveleges wird der angemeldete Benutzer als System zurückgegeben.

In beiden Fällen möchte ich den aktuellen angemeldeten Benutzer abrufen.

ist das überhaupt möglich?

War es hilfreich?

Lösung

Sie haben hier zwei mögliche Situationen.

case a: Sie befinden sich außerhalb des RunwithelevatedPrivilegs Scope Möglicherweise erhalten Sie eine erhöhte Spweb-Instanz, die außerhalb des Geltungsbereichs des Delegierten RunwithelevatedPrivilegs gespeichert wurde. Dies ist in den meisten Fällen ein Code-Horror, aber es ist immer noch möglich. In diesem Fall würde das Erstellen einer neuen Instanz basierend auf der URL des erhöhten Erneuen ausreichen: Die neue Instanz wird nicht erhöht, sodass Sie Ihren Benutzer von dort erhalten können.

case b: Ihre Methode wird in einem laufwithelevatedPrivilegs-Delegierten aufgerufen In diesem Fall wird das Erstellen der SPWEB-Instanz nicht gut. Jede neue Instanz wäre immer noch erhöht, also ist dies ein Nein. Um dieser Situation zu entkommen, müssen Sie eine Instanz finden, die außerhalb des Höhenbereichs erstellt wurde. Wie? Durch die Nutzung Ihres Ausführungskontextes: In einem Feature Event-Empfänger können Sie beispielsweise in den Ereigniseigenschaften usw. auf die Webinstanz zugreifen. Da Sie sich in einer benutzerdefinierten Methode befinden, und Sie können die empfangenen Parameter nicht ändern, Sie müssen auf eine Art Kontext zugreifen. Könnten Sie auf spcontext.current.web zurückgreifen? Diese Instanz ist nicht erhöht, daher sollte der Benutzer der aktuelle Surfen der Site sein. Das heißt, Sie können in einer Situation sein, in der der Kontext ungültig ist / null ist. In diesem Fall ist Afaik keine Möglichkeit, den ursprünglichen Benutzer von der erhöhten Instanz zu erhalten: Sie müssen es irgendwo speichern (Tipp: Ein statisches Singleton?) bevor Sie den Erhebungskontext betreten.


edit

Was tun, was zu tun ist, wenn Ihre Methode in einem Delegierten von RunwithelevatedPrivilegs aufgerufen wird, aber Sie sind nicht sicher, dass Sie einen gültigen SPCONTEXT haben? Dies ist nur eine sehr wilde Vermutung, aber lass uns darüber nachdenken. RunWithelevatedPrivilegyges werden in die Anwendungspoolidentität zurückkehren, oder? Wenn es keinen Anwendungsbecken gibt, würde dies bedeuten, dass es keine App-Poolidentität gibt, so dass der aktuelle Benutzer außerhalb und im Delegierten derselbe sein sollte. Wenn es einen App-Pool gibt, haben Sie meistens einen SPCONTEX, der per Definition nicht mehr definiert ist. Es gibt auch einen bestimmten Fall, in dem Sie in Timer-Jobs laufen, und den Kontext und ist der Kontext null: In diesem Fall glaube ich, dass Sie die App-Poolidentität sowieso verwenden, also wieder mit erhöhtem Sollte keine Wirkung.

Daraufhin erscheint es, dass Ihre beste Wette, wenn möglich, den Benutzer vom SPCONEX aus dem SPCONTEX verwenden soll, und nehme an, dass der erhöhte und nicht beliebte Benutzer gleich ist, wenn der Kontext null ist. Nimm das mit einem Salzkorn ...

Andere Tipps

Wie fazio erklärte, dass der ursprüngliche Entwickler, der den Verzüchterungskodex machte, sollte die verwendete Unpersönlichkeit, um das SPWEB-Objekt zu bestehen, aber in Ihrem Fall können Sie nicht!

Erhöhung bedeutet, dass Ihr Spweb-Objekt zum Systembenutzer erhöht ist und diesen Benutzer unabhängig davon, unabhängig davon, bis das Spweb-Objekt entsorgt wird! generasacodicetagpre.

Der obige Code würde funktionieren, wenn es aus dem erhöhten SPWEB-Objekt herausstellt, aber wenn es innerhalb des erhöhten Blocks ist, wird das Systemkonto unglücklich zurückgeben!

Kannst du einen Code posten?Oder geben Sie uns weitere Informationen dazu, wo Sie das übergebene SPWEB-Objekt verwenden möchten?Vielleicht können Sie den obigen Code im aktuellen offenen SPWEB-Objekt verwenden und dann das SPWEB-Objekt auf das erhöhte Objekt einstellen?

Aber kurze Antwort ist nein, Sie können den tatsächlich angemeldeten Anwender nicht von einem erhöhten Benutzer erhalten!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit sharepoint.stackexchange
scroll top