サンドボックス ソリューションを開発するためのベスト プラクティス

最終更新日: 2011年4月12日

適用対象: SharePoint Foundation 2010

この記事の内容
静的メンバーを作成しない
未処理の例外はスローしない
AllowPartiallyTrustedCallers 属性と SharePointPermission 属性の両方を使用する

SharePoint Online で使用可能

ここでは、サンドボックス ソリューションを開発するためのベスト プラクティスについて説明します。

静的メンバーを作成しない

SharePoint Foundation Sandboxed Code Service (User Code Host Service と呼ばれることもあります) を実行する指定されたサーバー上で初めて特定のサンドボックス ソリューションが処理されるとき、セキュリティで保護されたワーカー プロセスにそのサービスのアプリケーション ドメインが作成され、そのドメインにソリューション コードのすべての静的変数が読み込まれます。アプリケーション ドメインは、サンドボックス ソリューションが終了しても有効のままで、他のサイト コレクションの他のユーザーによってそのサンドボックス ソリューションが再度要求されたときに再利用されます。このシステムの副作用は静的な値が再読み込みされないことです。静的な値は、サンドボックス ソリューションを実行するすべての状況に適しているとは限りません。たとえば、ソリューション コードにより SPContext.Current が myContext とい名前の静的フィールドに挿入されるとします。このソリューションが他のサイト コレクションから要求された場合、myContext.Site の値は適切ではありません。

この理由から、セキュリティで保護されたコードでは静的なフィールドとプロパティは作成しないようにします。

未処理の例外はスローしない

処理されない例外をコードでスローしてはいけません。これはサンドボックス ソリューションの未処理の例外によって、例外をスローしたサンドボックス ソリューションを含め、セキュリティで保護されたワーカー プロセスのすべてのサンドボックス ソリューションが強制終了されるからです。この理由から、すべての例外をキャッチし、適切なエラーをサンドボックス ソリューションの UI (Exception オブジェクトの Message プロパティなど) にレポートすることをお勧めします。

AllowPartiallyTrustedCallers 属性と SharePointPermission 属性の両方を使用する

セキュリティで保護されたワーカー プロセスのコードでは、AllowPartiallyTrustedCallersAttribute を持つアセンブリのみを呼び出すことができます。つまり、サンドボックス ソリューションに展開するカスタム アセンブリのほとんどにこの属性が必要です。また、ASP.NET でも、WebPart から派生するクラスを含むすべてのアセンブリにこの属性が必要です。これらの理由から、Microsoft Visual Studio では、サンドボックス ソリューション プロジェクトの開始時は必ず、この属性が AssemblyInfo ファイルに既定で配置されます。ただし、ソリューション パッケージがファーム ソリューションとしてインストールされている場合は、この属性を持つアセンブリによってセキュリティ上の問題が発生します。これにより、部分的に信頼された呼び出し元が、完全信頼環境のアセンブリのクラスを呼び出すことができるからです。クラスのいずれかが SharePoint オブジェクト モデルにアクセスする場合、部分的に信頼された呼び出し元すべてが SharePoint オブジェクト モデルにアクセスできます。これを回避するには、AllowPartiallyTrustedCallers 属性としてマークされているアセンブリ内のすべてのクラスを、次のアクセス許可要求属性で修飾する必要があります。

[Microsoft.SharePoint.Security.SharePointPermission(System.Security.Permissions.SecurityAction.LinkDemand, ObjectModel=true)]

これにより、SharePoint オブジェクト モデルのアクセス許可を持つ呼び出し元のみが、クラスのメンバーを呼び出せるようになります。

AllowPartiallyTrustedCallers 属性は、サンドボックス ソリューションのすべてのアセンブリで要求されるわけではありません。たとえば、イベント レシーバーは、完全に信頼されている EventCodeHost によってのみ呼び出されるので、アセンブリにイベント レシーバーしか含まれない場合、AllowPartiallyTrustedCallers 属性を削除できます。

関連項目

概念

サンドボックス ソリューションで実装できるコンポーネント

その他の技術情報

サンドボックス ソリューション