3

次のC#の動作を説明してもらえますか?私は CAS について学ぶためだけに小さなコンソール アプリケーションを作成しましたが、次のコード行がそのように機能する理由を理解できないようです。

string[] myRoles = new string[] { "role1", "role2", "role3" };
GenericIdentity myIdentity = new GenericIdentity("myUsername", "customAuthType");
GenericPrincipal myPrincipal = new GenericPrincipal(myIdentity, myRoles);

System.Threading.Thread.CurrentPrincipal = myPrincipal;

Console.WriteLine(SecurityManager.IsGranted(new PrincipalPermission(null, "role1")));
Console.WriteLine(SecurityManager.IsGranted(new PrincipalPermission(null, "roleX")));

どちらの SecurityManager.IsGranted() 呼び出しでも、出力は「true」です。

次に、次の行を追加するとします。

 new PrincipalPermission(null, "role1").Demand();
 new PrincipalPermission(null, "roleX").Demand();

最初のデマンド コールはパスしますが、2 番目のデマンド コールは (予想どおり) SecurityException を引き起こします。

SecurityManager.IsGranted() 呼び出しが「roleX」権限に対して false を返さないのはなぜですか?

4

3 に答える 3

1

ここでの同様の質問への回答から、IsGranted() は CAS 権限でのみ機能し、非 CAS 権限では機能しないようです。

記事からの引用:

SecurityManager.IsGranted() は、管理者によって付与された CAS 権限を調べて、権限が付与されているかどうかを判断します。WorkingTimePermission は CAS 以外のアクセス許可であるため、管理者が設定したセキュリティ ポリシーはそのアクセス許可に関して影響を与えません。つまり、管理者が [CAS 以外のアクセス許可] を付与または取り消す方法はありません。したがって、SecurityManager.IsGranted() は [非 CAS 権限] に対して常に false を返します。

CAS パーミッションと CAS 以外のパーミッションに慣れ、「セキュリティ ポリシー」や「ポリシー」などのキー フレーズが CAS パーミッションにのみ適用されることに気付くまでには、しばらく時間がかかりました。これに慣れると、SecurityManager.IsGranted の Remarks セクションのような一見無害なヘルプ エントリの解読がはるかに簡単になりました。

「許可の付与はポリシーによって決定されます...」

これは、現在のセキュリティ ポリシーをチェックしているため、メソッドが CAS アクセス許可でのみ機能することを意味しますが、明示的には述べていません。慣れが必要です。

于 2008-11-26T00:37:40.210 に答える
0

SecurityManager.IsGrantedは主にコードの要求 (アセンブリなど) を見ていると思います - プリンシパルのアクセス許可などの特定の要求ではありません。

やりたいことをするには:

    static bool HasAccess(string role)
    {
        IPrincipal principal = System.Threading.Thread.CurrentPrincipal;
        return principal == null ? false : principal.IsInRole(role);
    }
于 2008-11-23T13:15:38.340 に答える