Partager via


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