PrincipalPermissionAttribute est obsolète en tant qu’erreur

Le constructeur PrincipalPermissionAttribute est obsolète et génère une erreur au moment de la compilation. Vous ne pouvez pas instancier cet attribut ou l’appliquer à une méthode.

Description de la modification

Sur .NET Framework et .NET Core, vous pouvez annoter des méthodes avec l’attribut PrincipalPermissionAttribute. Par exemple :

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

À compter de .NET 5, vous ne pouvez pas appliquer l’attribut PrincipalPermissionAttribute à une méthode. Le constructeur de l’attribut est obsolète et génère une erreur au moment de la compilation. Contrairement à d’autres avertissements d’obsolescence, vous ne pouvez pas supprimer l’erreur.

Raison du changement

Le type PrincipalPermissionAttribute, comme d’autres qui sont des sous-classes de SecurityAttribute, fait partie de l’infrastructure de sécurité d’accès au code (CAS) de .NET. Dans .NET Framework 2.x - 4.x, le runtime applique des annotations PrincipalPermissionAttribute à l’entrée de méthode, même si l’application s’exécute dans un scénario de confiance totale. .NET Core et .NET 5 et versions ultérieures ne prennent pas en charge les attributs CAS, et le runtime les ignore.

Cette différence de comportement entre .NET Framework et .NET Core et .NET 5 peut entraîner un scénario d’« échec d’ouverture », où l’accès aurait dû être bloqué, mais a été autorisé à la place. Pour éviter le scénario d’échec d’ouverture, vous ne pouvez plus appliquer l’attribut dans le code qui cible .NET 5 ou version ultérieure.

Version introduite

5,0

Si vous rencontrez l’erreur d’obsolescence, vous devez prendre des mesures.

  • Si vous appliquez l’attribut à un ASP.NET méthode d’action MVC :

    Envisagez d’utiliser l’infrastructure d’autorisation intégrée d’ASP.NET. Le code suivant montre comment annoter un contrôleur avec un attribut AuthorizeAttribute. Le runtime ASP.NET autorise l’utilisateur avant d’effectuer l’action.

    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.
            }
        }
    }
    

    Pour plus d’informations, consultez Autorisation basée sur les rôles dans ASP.NET Core et Présentation de l’autorisation dans ASP.NET Core.

  • Si vous appliquez l’attribut au code de bibliothèque en dehors du contexte d’une application web :

    Effectuez les vérifications manuellement au début de votre méthode. Pour ce faire, utilisez la méthode IPrincipal.IsInRole(String).

    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.
    }
    

API affectées