방법: 명령적 보안 검사 수행
명령적 요청의 경우 PrincipalPermission 개체의 Demand 메서드를 호출하면 현재 Principal 개체가 지정된 ID, 역할 또는 이 둘 모두를 나타내는지 확인할 수 있습니다. 올바르게 생성된 PrincipalPermission 개체의 이름이 MyPrincipalPermission일 경우 다음 코드를 사용하여 명령적 요청을 호출할 수 있습니다.
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 메서드에 액세스하는 데 필요한 principal 개체 및 identity 개체가 만들어집니다. 사용자가 다른 문자를 입력하면 principal 및 identity 개체가 만들어지지 않으며 PrivateInfo 메서드를 호출할 때 보안 예외가 throw됩니다. 현재 스레드의 이름이 MyUser이고 역할이 Administrator인 principal 개체에 연결되는 경우 다음 메시지가 나타납니다.
You have access to the private data!