PrincipalPermissionAttribute ist als Fehler veraltet

Der PrincipalPermissionAttribute-Konstruktor ist veraltet und generiert einen Kompilierzeitfehler. Sie können dieses Attribut nicht instanziieren oder auf eine Methode anwenden.

Änderungsbeschreibung

In .NET Framework und .NET Core können Sie Methoden mit dem PrincipalPermissionAttribute-Attribut versehen. Beispiel:

[PrincipalPermission(SecurityAction.Demand, Role = "Administrators")]
public void MyMethod()
{
    // Code that should only run when the current user is an administrator.
}

Ab .NET 5 können Sie das PrincipalPermissionAttribute-Attribut nicht auf eine Methode anwenden. Der Konstruktor für das Attribut ist veraltet und generiert einen Kompilierzeitfehler. Anders als bei anderen veralteten Warnungen können Sie den Fehler nicht unterdrücken.

Grund für die Änderung

Der PrincipalPermissionAttribute-Typ ist wie andere Typen, die SecurityAttribute als Unterklasse verwenden, Teil der CAS-Infrastruktur (Code Access Security) von .NET. In .NET Framework 2.x bis 4.x erzwingt PrincipalPermissionAttribute Anmerkungen für den Methodeneintrag selbst dann, wenn die Anwendung in einem Szenario mit voller Vertrauenswürdigkeit ausgeführt wird. .NET Core und .NET 5 oder höher unterstützen keine CAS-Attribute, und die Laufzeit ignoriert diese.

Dieser Unterschied im Verhalten von .NET Framework zu .NET Core und .NET 5 kann zu einem „Fail Open“-Szenario führen, bei dem der Zugriff hätte blockiert werden sollen, aber stattdessen zugelassen wurde. Um das „Fail Open“-Szenario zu verhindern, können Sie das Attribut nicht mehr in Code anwenden, der auf .NET 5 oder höher abzielt.

Eingeführt in Version

5.0

Wenn der Veraltungsfehler auftritt, müssen Sie Maßnahmen ergreifen.

  • Wenn Sie das Attribut auf eine ASP.NET MVC-Aktionsmethode anwenden:

    Verwenden Sie ggf. die integrierte Autorisierungsinfrastruktur von ASP.NET. Der folgende Code veranschaulicht, wie ein Controller mit einem AuthorizeAttribute-Attribut versehen wird. Die ASP.NET-Laufzeit autorisiert den Benutzer, bevor die Aktion ausgeführt wird.

    using Microsoft.AspNetCore.Authorization;
    
    namespace MySampleApp
    {
        [Authorize(Roles = "Administrator")]
        public class AdministrationController : Controller
        {
            public ActionResult MyAction()
            {
                // This code won't run unless the current user
                // is in the 'Administrator' role.
            }
        }
    }
    

    Weitere Informationen finden Sie unter Rollenbasierte Autorisierung in ASP.NET Core und Einführung in die Autorisierung in ASP.NET Core.

  • Wenn Sie das Attribut auf Bibliothekscode außerhalb des Kontexts einer Web-App anwenden:

    Führen Sie die Überprüfungen am Anfang der Methode manuell aus. Dies kann mithilfe der IPrincipal.IsInRole(String)-Methode erfolgen.

    using System.Threading;
    
    void DoSomething()
    {
        if (Thread.CurrentPrincipal == null
            || !Thread.CurrentPrincipal.IsInRole("Administrators"))
        {
            throw new Exception("User is anonymous or isn't an admin.");
        }
    
        // Code that should run only when user is an administrator.
    }
    

Betroffene APIs