Gewusst wie: Ausführen von obligatorischen Sicherheitsüberprüfungen
Für eine imperative Forderung können Sie die Demand-Methode des PrincipalPermission-Objekts aufrufen und so bestimmen, ob das aktuelle Prinzipalobjekt die angegebene Identität oder Rolle bzw. beide darstellt. Wenn das PrincipalPermission-Objekt mit der Bezeichnung MyPrincipalPermission korrekt erstellt wurde, kann mit dem folgenden Code eine imperative Anforderung aufgerufen werden.
MyPrincipalPermission.Demand()
MyPrincipalPermission.Demand();
Beispiel
Im folgenden Code wird mit einer imperativen Überprüfung sichergestellt, dass ein GenericPrincipal mit dem PrincipalPermission-Objekt übereinstimmt. Eine imperative Überprüfung ist sinnvoll, wenn viele Methoden oder andere Assemblys in der Anwendungsdomäne rollenbasierte Prüfungen durchführen müssen. Dieses Beispiel zeigt trotz seiner Einfachheit das Verhalten, das mit einer rollenbasierten Anforderung verbunden ist.
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);
}
}
}
Wenn der Benutzer 1 eingibt, werden das für den Zugriff auf die PrivateInfo -Methode erforderliche Principal- und das Identitätsobjekt erstellt. Wenn der Benutzer ein anderes Zeichen eingibt, werden keine Principal- und Identitätsobjekte erstellt, und es wird beim Aufruf der PrivateInfo-Methode eine Sicherheitsausnahme ausgelöst. Wenn der aktuelle Thread einem Principal mit dem Namen MyUser und der Rolle Administrator zugeordnet ist, wird die folgende Meldung angzeigt.
You have access to the private data!