motivi per elevare rientrano in due categorie:
- Il codice ha bisogno di eseguire operazioni in SharePoint per i quali l'utente corrente non dispone delle autorizzazioni. Ciò dovrebbe sempre essere eseguito mentre si lavora con la sicurezza di SharePoint, non come una misura "just in case" che indica che è necessario comprendere meglio la propria situazione di sicurezza.
- Il codice deve accedere a risorse esterne (file system del server, database, condivisione file, ecc.) A cui l'identità del pool di applicazioni ha accesso ma l'utente corrente no.
Per il primo, è molto meglio usare SPSite impersonation. Quest'ultima è l'unica ragione per cui utilizzo RWEP.
Per chiarire, RWEP non genera un nuovo thread. Invece utilizza le API Win32 per ripristinare l'identità del thread corrente all'identità del processo (disattivando la rappresentazione) per eseguire il codice elevato, quindi riattivare la rappresentazione per riprendere il lavoro per conto dell'utente corrente. Questo ha diverse implicazioni:
- RWEP non fa nulla se il filo non viene rappresentato, quindi è inutile in processi timer, flussi di lavoro di Visual Studio, applicazioni console ed eseguire codice tramite stsadm (funzione ricevitori).
- L'accesso a SharePoint, presupponendo che venga creato un nuovo SPSite nel proprio CodeToRunElevated, verrà eseguito con i diritti del pool di applicazioni (SHAREPOINT \ system). Questo account avrà pieno accesso all'applicazione web corrente, ma non dovrebbe avere autorizzazioni a livello di farm per fare cose come modificare proprietà SPFarm o apportare modifiche al provider di servizi condivisi.
- L'utilizzo di oggetti sensibili all'identità (come SPSite e i suoi figli) attraverso i limiti di esecuzione del tuo CodeToRunElevated ha il potenziale di causare alcuni comportamenti davvero funky e condizioni di gara. Per tutti gli effetti, considera questo non supportato.
E come ha detto Alex, i figli di un SPSite ereditano le loro autorizzazioni dal SPSite, che a sua volta ha le sue autorizzazioni impostate al momento della creazione. Quindi SPContext.Current.Site continuerà a comportarsi con le autorizzazioni dell'utente corrente anche se lo si fa riferimento all'interno di CodeToRunElevated. Invece, dovresti creare e consumare un nuovo SPSite all'interno del blocco sopraelevato.
Per riepilogare: RWEP per impersonare il pool di app al di fuori di SharePoint, rappresentazione SPSite per impersonare il pool di app all'interno di SharePoint.
Informazioni eccellenti, grazie Dahlbyk! –
buona risposta. potresti approfondire perché è inutile nei lavori con timer ecc.? –
Le applicazioni Web di SharePoint utilizzano la rappresentazione per eseguire codice come utente che ha effettuato l'accesso. RWEP disattiva temporaneamente la rappresentazione su un thread. Se il codice non è in esecuzione con la rappresentazione, come nel caso di un lavoro con timer o di una console, l'utente del thread e l'utente del processo ("utente con privilegi elevati" di RWEP) sono gli stessi. – dahlbyk