RunWithElevatedPrivileges
私は、SharePointの使用は疫病のように避けるべきだと強く感じていますが、正確な理由について他の人を説得する必要があります。これが私が持っているものです。
- 昇格された特権を持つ新しいスレッドを生成します
- 渡されたデリゲートが戻るまで、他の操作をブロックします
- セキュリティの問題(おそらくエンドユーザーによる高レベルの特権で実行されます)
- その他?
RunWithElevatedPrivileges
私は、SharePointの使用は疫病のように避けるべきだと強く感じていますが、正確な理由について他の人を説得する必要があります。これが私が持っているものです。
昇格する理由は2つのカテゴリに分類されます。
前者の場合、 SPSiteの偽装を使用する方がはるかに優れています。後者は私が今までRWEPを使用した唯一の理由です。
明確にするために、RWEPは新しいスレッドを生成しません。代わりに、Win32 APIを使用して現在のスレッドのIDをプロセスIDに戻し(偽装をオフにして)、昇格されたコードを実行し、偽装をオンに戻して現在のユーザーに代わって作業を再開します。これにはいくつかの意味があります。
また、Alexが述べたように、SPSiteの子は、SPSiteから権限を継承します。SPSiteは、作成時に権限が設定されます。したがって、SPContext.Current.Siteは、CodeToRunElevated内で参照している場合でも、現在のユーザーのアクセス許可で動作します。代わりに、昇格されたブロック内に新しいSPSiteを作成して使用する必要があります。
要約すると、SharePointの外部でアプリプールを偽装するためのRWEP、SharePointの内部でアプリプールを偽装するためのSPSiteの偽装。
1)RWEPの実質的な使用は、コードの臭いの良い兆候です。考えずに簡単に悪用される可能性があり、深刻なセキュリティ問題につながります。多くの開発者は、ユーザーが「内部」で間接的に与えられている力で何ができるかについて考えていません。
ほんの一例です。アプリケーションページでの悪意のあるリクエストを防ぐために、RWEPを使用する前にValidateFormDigestを呼び出すことが重要です。
2)SPWebおよびSPSiteオブジェクトは、RWEPのコンテキストで作成する必要があります。これは初心者の開発者にとって忘れがちであり、多くのフラストレーションにつながります。
この制限は、RWEPデリゲートが終了する前に、すべての作業とこれらのオブジェクトによって作成されたオブジェクトを使用して終了する必要があることも意味します。これはもう1つのよくある間違いです。
Keith Dahlbyは、これらの問題を回避するための拡張メソッドを作成し、より堅牢で読みやすいコードを提供しています。
RWEPには、他のすべてと同様に、長所と短所があります。
エンドユーザーがRWEPを実行していることを懸念している場合は、そのコードがすでにGACにインストールされているため、おそらくすでに大きな問題が発生しています。
場合によっては、それに固執する必要があります。管理者権限を持たないユーザーがドキュメントワークフローを実行していると考えてください。このユーザーが承認(または拒否、関係ありません)した後、ワークフローエンジンはそのSPListItem特権を再定義できるはずです。
私はそれを使用し、それが非常に便利な機能であることがわかりました。私の見解では、ユーザーに自分のコードを実行させ、そのコードにユーザーが通常は実行できないことを実行させることを選択しています。何かをロックダウンしても、ユーザーが非常に制御された方法でアクセスできるようにすることができます。