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