8

SharePoint RunWithElevatedPrivileges을 사용하는 것이 전염병처럼 피해야한다는 강한 감정이 있지만 다른 이유를 정확히 이유를 설득해야합니다. 여기에 내가 가진 것이있다.SharePoint 2007 - RunWithElevatedPrivileges - 이것을 사용함에있어서의 함몰함

  • 상승 된 권한
  • 전달 된 대리인이
  • 보안 문제를 반환 (최종 사용자가 아마도 권한의 높은 수준으로 실행)까지
  • 블록 다른 작업
  • 기타와 새 스레드를 산란한다?

답변

15

이유는 두 가지 범주로 가을을 상승 :

  1. 코드는 현재 사용자가 권한이없는있는 SharePoint의 작업을 수행 할 필요가있다. 이 작업은 SharePoint 보안으로 수행하는 동안 항상 수행해야합니다. 보안 상황을 더 잘 이해해야 함을 나타내는 "상황에 맞는"조치가 아니라 SharePoint 보안입니다.
  2. 코드는 응용 프로그램 풀 ID가 액세스 할 수 있지만 현재 사용자는 액세스 할 수없는 외부 리소스 (서버 파일 시스템, 데이터베이스, 파일 공유 등)에 액세스해야합니다.

전자의 경우 SPSite impersonation을 사용하면 훨씬 편리합니다. 후자가 내가 RWEP를 사용하는 유일한 이유입니다.

RWEP는 새 스레드를 생성하지 않습니다. 대신 Win32 API를 사용하여 현재 스레드의 ID를 프로세스 ID (되돌리기)로 되돌리고 승격 된 코드를 실행 한 다음 가장을 다시 켜고 현재 사용자를 대신하여 작업을 다시 시작합니다. 이것은 여러 가지 의미를 가지고 : 스레드가 가장 된 있지 않은 경우는 STSADM (기능 수신기)를 통해 타이머 작업, 비주얼 스튜디오 워크 플로우, 콘솔 응용 프로그램 및 코드 실행에 쓸모가 있도록

  1. RWEP는, 아무것도하지 않습니다.
  2. CodeToRunElevated에서 새 SPSite를 만드는 것으로 가정 할 경우 SharePoint에 대한 액세스는 응용 프로그램 풀 (SHAREPOINT \ system)의 권한으로 수행됩니다. 이 계정에는 현재 웹 응용 프로그램에 대한 모든 액세스 권한이 있지만 에 SPFarm 속성 수정이나 SSP 변경 작업을 수행 할 수있는 팜 수준 권한이 없어야합니다.
  3. CodeToRunElevated의 실행 경계에서 ID 인식 객체 (예 : SPSite 및 해당 하위 항목)를 사용하면 정말 펑키 한 동작 및 경쟁 조건이 발생할 수 있습니다. 모든 의도와 목적에 따라 지원되지 않는 것으로 간주하십시오.

그리고 Alex가 말했듯이 SPSite의 하위 항목은 SPSite에서 사용 권한을 상속받습니다. SPSite는 SPSite의 사용 권한을 생성 할 때 SPSite의 사용 권한을 상속합니다. 따라서 SPContext.Current.Site는 CodeToRunElevated 내에서 참조하더라도 현재 사용자의 권한으로 작동합니다. 대신 상승 된 블록 내에서 새 SPSite를 만들고 소비해야합니다.

정리하면 : RWEP는 SharePoint 외부에서 응용 프로그램 풀을 가장하고 SPSite 가장은 SharePoint 내부의 응용 프로그램 풀을 가장합니다.

+0

우수 정보, thanks Dahlbyk! –

+0

좋은 답변입니다. 타이머 작업 등에서 쓸데없는 이유에 대해 자세히 설명해 주시겠습니까? –

+1

SharePoint 웹 응용 프로그램은 가장을 사용하여 로그인 한 사용자로 코드를 실행합니다. - RWEP는 스레드에서 해당 가장을 일시적으로 끕니다. 타이머 작업 또는 콘솔 응용 프로그램과 같이 코드가 가장으로 실행되지 않으면 스레드 사용자 및 프로세스 사용자 (RWEP의 "승격 된 사용자")는 동일합니다. – dahlbyk

2

RWEP는 다른 모든 것과 마찬가지로 장단점이 있습니다.

RWEP를 실행하는 최종 사용자가 염려되는 경우 이미 코드가 GAC에 이미 설치되어 있으므로 더 큰 문제가있을 수 있습니다.

가끔은 그저 고수해야합니다. 관리자 권한이없고 문서 작업 과정을 실행하는 사용자를 생각해보십시오. 이 사용자가 승인 한 후에 (또는 거부해도 상관 없음) 워크 플로 엔진은 해당 SPListItem 권한을 다시 정의 할 수 있어야합니다.

+0

RunWithElevatedPrivileges를 피할 수있는 또 다른 이유가있을 수 있습니다. 코드 액세스 보안. Ruben, GAC 요구 사항의 출처를 확인할 수 있습니까? –

0

나는 그것을 사용하여 매우 유용한 기능임을 알게되었습니다. 내 견해로는 사용자가 내 코드를 실행하게하고 해당 코드가 사용자가 정상적으로 수행 할 수없는 작업을 수행하도록 선택합니다. 무언가를 잠그고 여전히 제어 된 방식으로 사용자가 액세스하도록 할 수 있습니다.

+0

"할 일"은 매우 광범위합니다. SharePoint 개체에 액세스하려면이 방법을 사용하지 마십시오. 대신 dahlbyk의 SPSite 제안을 따르십시오. RunWithElevatedPrivileges의 복잡성을 제거합니다. http://solutionizing.net/2009/01/06/elegant-spsite-elevation/ –

4

1) RWEP의 실질적인 사용은 코드 냄새를 잘 나타내줍니다. 심각한 보안 문제를 야기하는 생각없이 쉽게 학대받을 수 있습니다. 많은 개발자들은 사용자가 "간접적으로"제공되는 간접적 인 힘으로 무엇을 할 수 있는지 생각하지 않습니다.

RWEP를 사용하기 전에 ValidateFormDigest를 호출하는 것이 중요합니다. prevent malicious requests in application pages.


2) SPWeb 및 SPSite 개체 RWEP의 문맥에서 생성 될 필요가있다. 이것은 초보 개발자가 쉽게 잊어 버릴 수있어 많은 좌절감을 안겨줍니다.

이 제한은 또한 RWEP 대리인이 끝나기 전에 이러한 개체로 만든 모든 작업 및 모든 개체를 사용하고 완료해야 함을 의미합니다. 이것은 또 다른 흔한 실수입니다.

Keith Dahlby는 이러한 문제를 해결하기 위해 extension methods을 작성하여보다 강력하고 읽기 쉬운 코드를 제공합니다.

+0

"코드 냄새의 좋은 징후"- 나는 그것을 좋아합니다. 너무 나쁜 코는 저것을 위해 너무 일하지 않는다. ;) –