Domanda

Ho un requisito di essere in grado di ottenere sempre l'utente registrato.

L'oggetto Il processo di chiamata sta per passare è lo SPWeb.

Poiché questo è il codice legacy, non posso modificare ciò che i processi di chiamata inviano, ed ecco il problema: Alcuni di loro passano nello SPWeb in esecuzione come lo è, e alcuni inviano uno SPWeb in Privaleges elevati.Per le privateleges elevate, l'utente registrato viene restituito come sistema.

In entrambi i casi voglio ottenere l'utente attuale registrato.

è così possibile?

È stato utile?

Soluzione

Hai due possibili situazioni qui.

Caso A: Sei al di fuori dello scopo RunwithelevatedPrivileges È possibile ottenere un'istanza SPWEB elevata che è stata salvata al di fuori dell'ambito del delegato di RunwithelevatedPrivileges. Questo è un codice orrore nella maggior parte dei casi, ma è ancora possibile. In questo caso, ricreando un nuovo istanza basato sull'URL dell'URL dell'elevato è sufficiente: la nuova istanza non sarà essere elevata, quindi puoi ottenere il tuo utente da lì.

Case B: il metodo è chiamato all'interno di un delegato per il delegato con file a runwithelevatedPrivileges In questo caso, ricreare l'istanza SPWeb non ti farà bene. Qualsiasi nuova istanza sarebbe ancora elevata, quindi questo è un no. Per sfuggire a questa situazione, è necessario trovare un'istanza creata al di fuori della portata di elevazione. Come? Sfruttando il contesto dell'esecuzione: ad esempio, in un ricevitore evento funzionalità è possibile accedere all'istanza Web nelle proprietà dell'evento, ecc. Dato che si è in un metodo personalizzato e non è possibile modificare i parametri ricevuti, è necessario accedere ad alcuni tipi di contesto. Potresti ricorrere a spontext.current.web? Quell'istanza non è elevata, quindi l'utente dovrebbe essere quello attuale che sfoglia il sito. Detto questo, potresti essere in una situazione in cui il contesto non è valido / null, nel qual caso Afaik non c'è modo di ottenere l'utente originale dall'istanza elevata: dovrai archiviarlo da qualche parte (Suggerimento: un Singleton Statico?) prima di entrare nel contesto di elevazione.


.

Modifica

Cosa fare se il tuo metodo è chiamato all'interno di un delegato di runwithelevatedPrivileges ma non sei sicuro di avere un valido SpContext? Questa è solo un'ipotesi molto selvaggia, ma ci pensiamo. RunwithelevatedPrivileges ripristina l'identità del pool di applicazione, giusto? Se non c'è un pool di applicazioni significherebbe che non ci sia un'identità della pool di app, quindi l'utente corrente all'esterno e all'interno del delegato dovrebbe essere lo stesso. Se c'è una pool di app, la maggior parte del tempo avrai un SpContex, che non è gestito per definizione. Ci sono anche un caso specifico in cui si esegui in lavori timer e tali e il contesto è nullo: In tal caso credo che tu stia utilizzando l'identità dell'App Pool Identity, quindi di nuovo, correre con elevato. Nessun effetto.

Sulla base di ciò, sembra che la tua migliore scommessa sia quella di utilizzare l'utente dallo SpContex quando possibile, e assumere l'utente elevato e non elevato ad essere lo stesso quando il contesto è nullo. Prendilo con un granello di sale però ...

Altri suggerimenti

Poiché il Fazio ha dichiarato lo sviluppatore originale che ha reso il codice lafeo debba essere utilizzata l'impersonazione usata per passare l'oggetto SPWEB, ma nel tuo caso no non puoi!

Elevazione significa che il tuo oggetto SPWeb è elevato all'utente del sistema e restituirà quell'utente a prescindere dall'utente che nonostante l'oggetto SPWeb sia disposto!

SPUser loggedinUser = SPContext.Current.Web.CurrentUser;
.

Il codice sopra funzionante se è uscito dall'elevato oggetto SPWEB, ma se il suo entro il blocco elevato restituisse l'account di sistema Poltimtaly!

puoi pubblicare un codice?O dANCI ALTRO INFORMAZIONI INFORMAZIONI IN QUO VOSA UTILIZZARE L'OGGETTO SPWEB È PASSATO?Forse è possibile utilizzare il codice sopra nell'oggetto Apri SPWEB corrente e quindi impostare l'oggetto SPWeb sull'oggetto elevato?

Ma la risposta breve non è possibile ottenere l'utente effettivo registrato da un utente elevato!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a sharepoint.stackexchange
scroll top