Code Access Securityその3

今回はコードグループについてです。先ずは各セキュリティポリシーのコードグループを見てみましょう。

Visual Studio 2005日本語版RCを入れてしまったので、今回は日本語になってしまっていますが気にしないでください。(^^;

UserとEnterpriseのコードグループにはAll_Codeというグループしかなく、その権限はFullTrustになっています。一方、MachineのコードグループにもAll_Codeはありますが、その下に子グループがぶら下がっていますね。さて、MachineのAll_Codeグループの権限は何だと思いますでしょうか? 実は、Nothingになっています。え?っとなった人がいるかも知れません。前回、権限は論理積になっていると説明していました。だとするとNothingなんて権限があったら、全部Nothingになってしまいますよね。実は、All_Code以下の権限は論理和を取るのです。あっちは論理積でこっちは論理和とワザとややこしくしているんじゃないか?と思いたくなりますね。(^^;

今度はコードグループに注目します。

実行するアプリケーションがどのグループに属するかは、どのように決定するのでしょうか。まぁ、グループの名前からMy_Computer_Zoneならローカルマシンだろうし、Internet_Zoneならインターネットから実行した場合だろうというのは想像が付きますが、ネーミングルールで決まるのでしょうか? もちろん、そんなことはありません。ちょっとグループのプロパティを見てみましょう。

My_Computer_Zoneの例です。メンバシップ条件に条件の種類とその値が設定できるようになっていて、上記の場合だと「ゾーン」で「マイコンピュータ」になっていたのでした。

ところで、最初から用意されているコードグループは排他的になっていますが、同時に複数の条件に当てはまるとどうなるのでしょうか? 「Copy_of_Mei_Test_Zone」というテスト用のグループを作成してメンバシップ条件に「厳密な名前」を指定してみました。

この状態でローカルマシンからメンバシップ条件に一致する厳密な名前を持ったアプリケーションを実行してみます。すると、「My_Computer_Zone」と「Copy_of_Mei_Test_Zone」の両方がマッチして、その論理和が権限になります。さて、もし、どちらか一方を優先したい場合はどうすれば良いでしょうか?

このように優先したいグループにチェックを付けてあげれば良いです。勿論、矛盾するような(複数のグループでこの指定を行うなど)設定は出来ないようになっています。

これでプログラムが起動時にどのような権限を持つかが分かりました。ちなみにこれがプログラムか持ちうる権限の最大値になります。実行しているコードが、これ以上の権限を得ることは出来ません。
例えば、次のようなコードがあったとします。

using System;
using System.IO;
using System.Security;
using System.Security.Permissions;
using System.Security.Policy;

[assembly:ReflectionPermission(SecurityAction.RequestMinimum)]
static class Program {
    public static void Main (string [] args) {
    }
}

先頭付近の、

[assembly:ReflectionPermission(SecurityAction.RequestMinimum)]

に注目。リフレクション権限を取得しようとしているように見えますが、実は、このコードの意味はロード時に決定した権限の中にリフレクション権限があるかどうかをチェックしていて、無ければ例外が発生します。繰り返しになりますが、コード上で新たな権限を与えることは出来ず、権限を制限する方向でしかコーディング出来ません。

また、次回に続く・・・はず。(^^;