Freigeben über


Direktes Zugreifen auf ein Principalobjekt

In erster Linie werden imperative und deklarative Forderungen für den Aufruf rollenbasierter Sicherheitsüberprüfungen zum Prüfen und Erzwingen von Identität und Rollenmitgliedschaft verwendet. Dennoch kann in einigen Fällen ein direkter Zugriff auf das Principal-Objekt und das zugeordnete Identity-Objekt wünschenswert sein, bei dem ohne zusätzlich erstellte Berechtigungsobjekte Autorisierungsaufgaben durchgeführt werden können. So können deklarative oder imperative Anforderungen z. B. nicht verwendet werden, wenn das Auslösen einer Ausnahme bei einer fehlgeschlagenen Validierung vermieden werden soll. In diesem Fall können Sie die statische CurrentPrincipal-Eigenschaft der System.Threading.Thread-Klasse verwenden, um auf das Principal-Objekt zuzugreifen und dessen Methoden aufzurufen.

Nach dem Abrufen des Principalobjekts können Sie, wie das folgende Codebeispiel veranschaulicht, über bedingte Anweisungen den Principalnamen prüfen und so den Zugriff auf den Code steuern.

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

Sie können die Rollenmitgliedschaft auch programmgesteuert überprüfen, indem Sie die IsInRole-Methode für das aktuelle Principal-Objekt aufrufen, wie das folgende Codebeispiel veranschaulicht.

// 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

Sie können dieses Verfahren z. B. für den Zugriff auf Verhalten verwenden, die spezifisch für ein anwendungsdefiniertes Principal-Objekt sind. In den meisten Fällen wird aber die PrincipalPermission-Klasse zum Steuern des Codezugriffs über Identitäten und Rollenmitgliedschaften verwendet.

Im folgenden Codebeispiel werden ein WindowsPrincipal-Objekt und ein WindowsIdentity-Objekt erstellt, diese werden auf den aktuellen Benutzer festgelegt, und es wird eine Sicherheitsentscheidung je nach dem Wert des Principal getroffen. Das PrincipalPermission-Objekt wird weder imperativ noch deklarativ verwendet. Stattdessen wird der gewährte Zugriff anhand der Werte des Principalobjekts ermittelt.

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

Ist der aktuelle Benutzer MYDOMAIN\myuser, zeigt dieses Programm in der Konsole folgende Meldung an:

Hello MYDOMAIN\myuser, you are authenticated!

Wenn jedoch ein anderer Benutzer als aktueller Benutzer angemeldet ist, zeigt das Programm folgende Meldung an.

Go away! You are not authorized!

MyPrincipal.Identity.Name enthält als Wert die Domäne und den Benutzernamen, der das autorisierte Konto darstellt. Beachten Sie, dass in C# der Zeichenfolge "MYDOMAIN\myuser" das Zeichen "@" vorangestellt wird, damit der umgekehrte Schrägstrich nicht als Escapezeichen interpretiert wird. Im vorherigen Beispiel wird ein WindowsIdentity-Objekt verwendet. Sie können einen ähnlichen Code aber auch mit einem generischen Objekt erstellen. Erstellen Sie einfach eine Instanz des generischen Objekts, übergeben Sie dieser die gewünschten Werte, und überprüfen Sie später das Objekt auf diese Werte.

Siehe auch

Referenz

System.Threading.Thread.CurrentPrincipal

Konzepte

Überprüfungen bei rollenbasierter Sicherheit