Практическое руководство. Выполнение принудительной проверки безопасности

Для выполнения принудительного требования можно вызвать метод Demand объекта PrincipalPermission, чтобы определить, предоставлены ли в текущем объекте-участнике определенное удостоверение, роль или и то и другое. Если предположить, что существует правильно построенный объект 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. При вводе любого другого знака объект-участник и объект-удостоверение не создаются, а при вызове метода PrivateInfo возникает исключение безопасности. Если текущий поток связан с участником с именем MyUser и ролью Administrator, выводится следующее сообщение.

You have access to the private data!

См. также

Ссылки

PrincipalPermission

Основные понятия

Проверка безопасности на основе ролей