方法 : 強制セキュリティ チェックを実行する
更新 : 2007 年 11 月
強制的な確認要求として、PrincipalPermission オブジェクトの Demand メソッドを呼び出すと、現在のプリンシパル オブジェクトが指定の ID、ロール、または ID とロールの両方を表すかどうかを調べることができます。MyPrincipalPermission という PrincipalPermission オブジェクトが適切に構築されているものとして、強制的な確認要求を呼び出すコードを次に示します。
MyPrincipalPermission.Demand()
MyPrincipalPermission.Demand();
使用例
次に示すコードでは、強制的なチェックを使用して、GenericPrincipal が PrincipalPermission オブジェクトに一致することを確認します。強制的なチェックは、アプリケーション ドメイン内の多数のメソッドやその他のアセンブリがロール ベースの決定を行う必要があるときに便利です。ロール ベースの確認要求に関連する動作を説明する、きわめて簡単なコードの例を次に示します。
Imports System
Imports System.Security.Permissions
Imports System.Security.Principal
Imports System.Security
Imports System.Threading
Imports System.Security.Cryptography
Public Class MainClass
Public Overloads Shared Function Main() As Integer
Console.WriteLine("Enter '1' to use the proper identity or " _
& "any other character to use the improper identity.")
If Console.ReadLine() = "1" Then
' Create a generic identity.
Dim MyIdentity As New GenericIdentity("MyUser")
' Create a generic principal.
Dim MyString As [String]() = {"Administrator", "User"}
Dim MyPrincipal As New GenericPrincipal( _
MyIdentity, MyString)
Thread.CurrentPrincipal = MyPrincipal
End If
PrivateInfo()
Return 0
End Function
Public Shared Sub PrivateInfo()
Try
' Create a PrincipalPermission object.
Dim MyPermission As New PrincipalPermission( _
"MyUser", "Administrator")
' Demand this permission.
MyPermission.Demand()
' Print secret data.
Console.WriteLine(ControlChars.Cr & ControlChars.Cr & _
"You have access to the private data!")
Catch e As SecurityException
Console.WriteLine(e.Message)
End Try
End Sub
End Class
using System;
using System.Security.Permissions;
using System.Security.Principal;
using System.Security;
using System.Threading;
using System.Security.Cryptography;
public class MainClass
{
public static int Main(string[] args)
{
Console.WriteLine("Enter '1' to use the proper identity or " +
"any other character to use the improper identity.");
if(Console.ReadLine() == "1")
{
// Create a generic identity.
GenericIdentity MyIdentity = new GenericIdentity("MyUser");
// Create a generic principal.
String[] MyString = {"Administrator", "User"};
GenericPrincipal MyPrincipal =
new GenericPrincipal(MyIdentity, MyString);
Thread.CurrentPrincipal = MyPrincipal;
}
PrivateInfo();
return 0;
}
public static void PrivateInfo()
{
try
{
// Create a PrincipalPermission object.
PrincipalPermission MyPermission =
new PrincipalPermission("MyUser", "Administrator");
// Demand this permission.
MyPermission.Demand();
// Print secret data.
Console.WriteLine(
"\n\nYou have access to the private data!");
}
catch(SecurityException e)
{
Console.WriteLine(e.Message);
}
}
}
ユーザーが 1 を入力すると、PrivateInfo メソッドへのアクセスに必要なプリンシパル オブジェクトと ID オブジェクトが作成されます。ユーザーがそれ以外の文字を入力した場合は、プリンシパル オブジェクトと ID オブジェクトは作成されず、PrivateInfo メソッドを呼び出したときにセキュリティ例外がスローされます。現在のスレッドが MyUser という名前のプリンシパルと Administrator ロールに関連する場合は、次のメッセージが表示されます。
You have access to the private data!