Condividi tramite


Procedura: eseguire controlli di protezione imperativi

Aggiornamento: novembre 2007

Per una pretesa imperativa è possibile chiamare il metodo Demand dell'oggetto PrincipalPermission per determinare se l'oggetto principale corrente rappresenti l'identità o il ruolo specificato o entrambi. Supponendo che un oggetto PrincipalPermission adeguatamente costruito abbia chiamato MyPrincipalPermission, sarà possibile chiamare una pretesa imperativa con il codice che segue.

MyPrincipalPermission.Demand()
MyPrincipalPermission.Demand();

Esempio

Nell'esempio di codice seguente viene utilizzato un controllo imperativo per verificare che un oggetto GenericPrincipal corrisponda all'oggetto PrincipalPermission. I controlli imperativi sono utili quando è necessario che numerosi metodi o altri assembly del dominio applicazione effettuino operazioni basate sui ruoli. Sebbene questo esempio sia estremamente semplice, viene illustrato il comportamento associato a una pretesa basata sui ruoli.

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);
        }
    }
}

Se l'utente digita 1, vengono creati gli oggetti Principal e Identity necessari per accedere al metodo PrivateInfo. Se l'utente digita un altro carattere, non viene creato alcun oggetto Principal e Identity e quando viene chiamato il metodo PrivateInfo viene generata un'eccezione di protezione. Se il thread corrente è associato a un oggetto Principal con il nome MyUser e il ruolo Administrator, sarà visualizzato il messaggio riportato di seguito.

You have access to the private data!

Vedere anche

Concetti

Controlli della protezione basata sui ruoli

Riferimenti

PrincipalPermission