Share via


Accesso diretto agli oggetti Principal

Sebbene il ricorso a richieste imperative e dichiarative per richiamare i controlli della sicurezza basata sui ruoli rappresenti il meccanismo principale per il controllo e l'applicazione dell'identità e dell'appartenenza ai ruoli, possono presentarsi casi in cui si desidera accedere direttamente all'oggetto Principal e all'oggetto Identity a esso associato per eseguire attività di autorizzazione senza creare oggetti di permesso. È ad esempio possibile che si preferisca non utilizzare richieste dichiarative o imperative se non si desidera che venga generata un'eccezione in modo predefinito quando una convalida ha esito negativo. In tal caso, è possibile utilizzare la proprietà statica CurrentPrincipal sulla classe System.Threading.Thread per accedere all'oggetto Principal e chiamarne i metodi.

Dopo aver ottenuto l'oggetto Principal, è possibile utilizzare istruzioni condizionali per controllare l'accesso al codice sulla base del nome del principale, come illustrato nell'esempio di codice che segue.

WindowsPrincipal MyPrincipal = 
    (WindowsPrincipal)Thread.CurrentPrincipal;
if (MyPrincipal.Identity.Name == "fred") 
    // Permit access to some code. 
Dim MyPrincipal As WindowsPrincipal = _
    CType(Thread.CurrentPrincipal, WindowsPrincipal)
If (MyPrincipal.Identity.Name = "fred") Then
    ' Permit access to some code.
End If

È inoltre possibile controllare a livello di codice l'appartenenza ai ruoli richiamando il metodo IsInRole sull'oggetto Principal corrente, come illustrato nel seguente esempio di codice.

// Get the current identity.
WindowsIdentity MyIdent = WindowsIdentity.GetCurrent();

// Create a principal.
WindowsPrincipal MyPrincipal = new WindowsPrincipal(MyIdent);

// Check the role using a string.
if (MyPrincipal.IsInRole(@"BUILTIN\Administrators"))
{
    Console.WriteLine("You are an administrator.");
}
else
{
    Console.WriteLine("You are not an administrator.");
}
// Check the role using an enumeration.
if (MyPrincipal.IsInRole(WindowsBuiltInRole.Administrator))
{
    Console.WriteLine("You are an administrator.");
}
else
{
    Console.WriteLine("You are not an administrator.");
}
' Get the current identity.
Dim MyIdent As WindowsIdentity = WindowsIdentity.GetCurrent()

' Create a principal.
Dim MyPrincipal As New WindowsPrincipal(MyIdent)

' Check the role using a string.
If MyPrincipal.IsInRole("BUILTIN\Administrators") Then
    Console.WriteLine("You are an administrator.")
Else
    Console.WriteLine("You are not an administrator.")
End If
' Check the role using an enumeration.
If MyPrincipal.IsInRole(WindowsBuiltInRole.Administrator) Then
    Console.WriteLine("You are an administrator.")
Else
    Console.WriteLine("You are not an administrator.")
End If

È possibile ricorrere a questa tecnica quando si desidera accedere a funzionalità specifiche di un oggetto Principal definito dall'applicazione. Nella maggior parte dei casi, tuttavia, la classe PrincipalPermission viene utilizzata per controllare l'accesso al codice sulla base dell'identità o dell'appartenenza ai ruoli.

Nell'esempio di codice riportato di seguito vengono creati un oggetto WindowsPrincipal e un oggetto WindowsIdentity, vengono impostati sull'utente corrente e viene presa una decisione relativa alla sicurezza in base al valore dell'oggetto Principal. Non viene utilizzato alcun oggetto PrincipalPermission in modo imperativo o in modo dichiarativo poiché la decisione relativa all'accesso viene stabilita in base ai valori dell'oggetto Principal.

using System;
using System.Security.Permissions;
using System.Security.Policy;
using System.Security.Principal;
using System.Threading;

public class Class1
{
    public static int Main(string[] args)
    {
        // Set principal policy to get a WindowsPrincipal 
        // as the current principal so you have permission to get 
        // current user information.
        AppDomain.CurrentDomain.SetPrincipalPolicy(
            PrincipalPolicy.WindowsPrincipal);

        // Get the current principal and put it into a principal object.
        WindowsPrincipal myPrincipal = (Thread.CurrentPrincipal 
            as WindowsPrincipal);

        // Check the name and see if the user is authenticated. 
        if (myPrincipal.Identity.Name.Equals(@"MYDOMAIN\myuser") 
            && myPrincipal.Identity.IsAuthenticated.Equals(true))
        {
            Console.WriteLine("Hello {0}, you are authenticated!", 
                myPrincipal.Identity.Name.ToString());
        }
        else
        {
            Console.WriteLine("Go away! You are not authorized!");
        }
        // Use IsInRole to determine the role of the current user.
        Array wbirFields = Enum.GetValues(typeof(WindowsBuiltInRole));
        foreach (object roleName in wbirFields)
        {
            try
            {
                Console.WriteLine("{0}? {1}.", roleName,
                    myPrincipal.IsInRole((WindowsBuiltInRole)roleName));
            }
            catch (Exception)
            {
                Console.WriteLine("{0}: Could not obtain role for this RID.",
                    roleName);
            }
        }
        return 0;
    }
}  
Imports System
Imports System.Security.Permissions
Imports System.Security.Policy
Imports System.Security.Principal
Imports System.Threading

Public Class Class1

    Public Shared Sub Main()
        ' Set principal policy to get a WindowsPrincipal 
        ' as the current principal so you have permission to get
        ' current user information.
        AppDomain.CurrentDomain.SetPrincipalPolicy( _
            PrincipalPolicy.WindowsPrincipal)

        ' Get the current principal and put it into a principal object.
        Dim MyPrincipal As WindowsPrincipal = _
            CType(Thread.CurrentPrincipal, WindowsPrincipal)

        ' Check the name and see if the user is authenticated. 
        If (MyPrincipal.Identity.Name.Equals("MYDOMAIN\myuser") _
            And MyPrincipal.Identity.IsAuthenticated) Then
            Console.WriteLine("Hello {0}, you are authenticated!", _
                MyPrincipal.Identity.Name.ToString())
        Else
            Console.WriteLine("Go away! You are not authorized!")
        End If
        ' Use IsInRole to determine the role of the current user.
        Dim wbirFields As Array = _
            [Enum].GetValues(GetType(WindowsBuiltInRole))

        Dim roleName As Object
        For Each roleName In wbirFields
            Try
                Console.WriteLine("{0}? {1}.", roleName, _
                    MyPrincipal.IsInRole(CType(roleName, _
                    WindowsBuiltInRole)))
            Catch
                Console.WriteLine( _
                    "{0}: Could not obtain the role for this RID.", _
                    roleName)
            End Try
        Next roleName
    End Sub
End Class

Se l'utente corrente è MYDOMAIN\myuser, il programma visualizzerà il seguente messaggio sulla console.

Hello MYDOMAIN\myuser, you are authenticated!

Se tuttavia l'utente corrente è rappresentato da qualsiasi altro utente, verrà visualizzato il seguente messaggio.

Go away! You are not authorized!

Il valore in MyPrincipal.Identity.Namemostra il dominio e il nome utente che rappresentano l'account autorizzato. Si noti che in C# davanti alla stringa "MYDOMAIN\myuser" viene inserito il prefisso "@", in modo che il carattere di barra rovesciata (\) non venga interpretato come un carattere di escape. Sebbene l'esempio precedente utilizzi un oggetto WindowsIdentity, è facilmente possibile creare codice analogo facendo uso di un oggetto generico. Creare semplicemente un'istanza dell'oggetto generico, passarvi i valori desiderati e in seguito controllare che l'oggetto presenti tali valori.

Vedere anche

Riferimenti

System.Threading.Thread.CurrentPrincipal

Concetti

Controlli della sicurezza basata sui ruoli