Razones para elevar dividen en dos categorías:
- el código necesita para llevar a cabo operaciones en SharePoint para el cual el usuario actual no tiene permisos. Esto siempre debe hacerse al trabajar con seguridad de SharePoint, no como una medida "por si acaso", lo que indica que necesita comprender mejor su situación de seguridad.
- Su código necesita acceder a los recursos externos (sistema de archivos del servidor, base de datos, recurso compartido de archivos, etc.) a los que tiene acceso la identidad del grupo de aplicaciones, pero el usuario actual no.
Para el primero, es mucho mejor usar SPSite impersonation. Esta última es la única razón por la que uso RWEP.
Para aclarar, RWEP no genera un nuevo hilo. En su lugar, utiliza las API de Win32 para revertir la identidad del hilo actual a la identidad del proceso (desactivar la suplantación) para ejecutar el código elevado y luego volver a activar la suplantación para reanudar el trabajo en nombre del usuario actual. Esto tiene varias implicaciones:
- RWEP no hace nada si el hilo no se suplanta, por lo que es inútil en los trabajos del temporizador, flujos de trabajo de Visual Studio, las aplicaciones de consola, ejecutar el código a través de stsadm (receptores de función).
- El acceso a SharePoint, suponiendo que cree una nueva SPSite en su CodeToRunElevated, se realizará con los derechos del grupo de aplicaciones (SHAREPOINT \ system). Esta cuenta tendrá acceso completo a la aplicación web actual, pero no debe tener permisos de nivel de granja para hacer cosas como modificar propiedades de SPFarm o realizar cambios en el SSP.
- El uso de objetos sensibles a la identidad (como SPSite y sus hijos) a través de los límites de ejecución de su CodeToRunElevated tiene el potencial de causar un comportamiento realmente funky y condiciones de carrera. Para todos los efectos, considere esto sin respaldo.
Y como dijo Alex, los hijos de un SPSite heredan sus permisos del SPSite, que a su vez tiene sus permisos establecidos cuando se crea. Así que SPContext.Current.Site todavía se comportará con los permisos del usuario actual, incluso si lo hace referencia dentro de su CodeToRunElevated. En cambio, necesitaría crear y consumir un nuevo SPSite dentro del bloque elevado.
Para resumir: RWEP para suplantar el Pool de aplicaciones fuera de SharePoint, la suplantación SPSite para suplantar el Pool de aplicaciones dentro de SharePoint.
Información excelente, gracias Dahlbyk! –
buena respuesta. ¿Podrías explicar por qué es inútil en trabajos de temporizador, etc.? –
Las aplicaciones web de SharePoint usan suplantación para ejecutar código como el usuario que inició sesión: RWEP simplemente desactiva esa suplantación en un hilo. Si para empezar, el código no se ejecuta con suplantación, como en un trabajo de temporizador o una aplicación de consola, el usuario del subproceso y el usuario del proceso ("usuario elevado" de RWEP) son los mismos. – dahlbyk