Partager via


Comment : exécuter les vérifications de sécurité impératives

Mise à jour : novembre 2007

Pour une demande impérative, vous pouvez appeler la méthode Demand de l'objet PrincipalPermission afin de déterminer si l'objet Principal en cours représente l'identité ou le rôle spécifié, ou les deux. Si l'on suppose qu'un objet PrincipalPermission, appelé MyPrincipalPermission, a été correctement construit, une demande impérative peut être appelée en utilisant le code suivant.

MyPrincipalPermission.Demand()
MyPrincipalPermission.Demand();

Exemple

L'exemple de code suivant utilise une vérification impérative pour s'assurer qu'un objet GenericPrincipal correspond à l'objet PrincipalPermission. Une vérification impérative est utile lorsque de nombreuses méthodes et autres assemblys du domaine d'application doivent accorder des autorisations basées sur les rôles. Cet exemple, bien que très simple, suffit à illustrer le comportement associé à une demande basée sur les rôles.

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

Si l'utilisateur entre 1, les objets Principal et Identity requis pour accéder à la méthode PrivateInfo sont créés. Si l'utilisateur entre n'importe quel autre caractère, aucun objet principal et identity n'est créé et une exception de sécurité est levée lorsque la méthode PrivateInfo est appelée. Si le thread en cours est associé à un objet principal dont le nom est MyUser et le rôle Administrator, le message suivant s'affiche.

You have access to the private data!

Voir aussi

Concepts

Contrôles de sécurité basés sur les rôles

Référence

PrincipalPermission