Question

J'ai une obligation de pouvoir toujours obtenir l'utilisateur connecté.

L'objet Le processus d'appel va passer est le SPWEB.

Comme il s'agit du code hérité, je ne peux pas modifier ce que les processus d'appel envoient, et voici le problème: Certains d'entre eux passent dans le SPWEB fonctionnant comme il est, et certains envoient une SPWEB dans des privilèges élevés.Pour les privelles élevées, l'utilisateur connecté est renvoyé en tant que système.

Dans les deux cas, je veux obtenir le courant connecté à l'utilisateur.

est-ce possible?

Était-ce utile?

La solution

Vous avez deux situations possibles ici.

Case A: Vous êtes en dehors de la pérennité des privilèges. / fort> Vous obtiendrez peut-être une instance SPWEB élevée qui a été sauvée en dehors de la portée des délégués RunwithElementEvileVileges. C'est une horreur du code dans la plupart des cas, mais il est toujours possible. Dans ce cas, la recréation d'une nouvelle instance basée sur l'URL de l'élevée serait suffisante: la nouvelle instance ne sera pas élevée, afin que vous puissiez obtenir votre utilisateur de là.

Case B: Votre méthode est appelée à l'intérieur d'un délégué des voyageurs d'ailleurs. Dans ce cas, recréer l'instance SPWeb ne vous fera aucun bien. Toute nouvelle instance serait toujours élevée, c'est donc un non go. Pour échapper à cette situation, vous devez trouver une instance créée en dehors de la portée d'élévation. Comment? En exploitant votre contexte d'exécution: par exemple, dans un récepteur d'événement de fonctionnalité, vous pouvez accéder à l'instance Web dans les propriétés de l'événement, etc., car vous êtes dans une méthode personnalisée et vous ne pouvez pas modifier les paramètres reçus, vous devez accéder à une sorte de contexte. Pourriez-vous recourir à spcontext.current.web? Cette instance n'est pas élevée, l'utilisateur doit donc être le point actuel de naviguer sur le site. Cela dit, vous pouvez être dans une situation où le contexte est invalide / null, auquel cas Afaik il n'y a aucun moyen d'obtenir l'utilisateur d'origine de l'instance élevée: vous devrez le stocker quelque part (Astuce: un singleton statique?) avant d'entrer dans le contexte d'élévation.


Modifier

Que faire si votre méthode est appelée à l'intérieur d'une déléguée d'aperçueProvilithelevachedprivileges, mais vous n'êtes pas sûr d'avoir un SPContext valide? Ce n'est qu'une conjecture très sauvage, mais pensions-y. Runwithheélévatedprivileges revenir à l'identité du pool d'applications, non? S'il n'y a pas de pool d'applications, cela signifierait qu'il n'y a pas d'identité de pool d'applications, l'utilisateur actuel à l'extérieur et à l'intérieur du délégué devrait être identique. S'il y a un pool d'applications, la plupart du temps, vous aurez un SPContex, qui n'est pas revêtue par définition. Il existe également un cas spécifique dans lequel vous rencontrez des emplois de minuterie et que vous et Le contexte est NULL: Dans ce cas, je pense que vous utilisez l'identité de la piscine d'application de toute façon, à nouveau, courez avec surélevé. aucun effet.

Basé sur ceci, il semblerait que votre meilleur pari soit d'utiliser l'utilisateur à partir du SPContex lorsque cela est possible et d'assumer l'utilisateur élevé et non agréé comme étant le même lorsque le contexte est null. Prenez cela avec un grain de sel si ...

Autres conseils

Comme Fazio a déclaré que le développeur d'origine qui a créé le code de lagacité devrait être utilisé sur l'impersonnation de passer l'objet SPWeb, mais dans votre cas, vous ne pouvez pas!

Elevage signifie que votre objet SPWeb est élevé à l'utilisateur du système et retournera cet utilisateur, sans toutefois, l'objet SPWeb est disposé!

SPUser loggedinUser = SPContext.Current.Web.CurrentUser;

Le code ci-dessus fonctionnerait si elle est sortie de l'objet SPWEB élevé, mais si elle se trouve dans le bloc élevé, il retournera le compte système malheureux!

Pouvez-vous poster du code?Ou donnez-nous d'autres informations sur l'endroit où vous allez utiliser l'objet SPWEB qui est passé?Peut-être que vous pouvez utiliser le code ci-dessus dans l'objet Open SPWeb actuel, puis définir l'objet SPWeb sur l'objet élevé?

mais une réponse courte est non, vous ne pouvez pas obtenir l'utilisateur connecté réel à partir d'un utilisateur élevé!

Licencié sous: CC-BY-SA avec attribution
Non affilié à sharepoint.stackexchange
scroll top