PrincipalPermissionAttribute è obsoleto come errore

Il costruttore PrincipalPermissionAttribute è obsoleto e genera un errore in fase di compilazione. Non è possibile creare un'istanza di questo attributo o applicarlo a un metodo.

Descrizione delle modifiche

In .NET Framework e .NET Core è possibile annotare i metodi con l'attributo PrincipalPermissionAttribute. Ad esempio:

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

A partire da .NET 5, non è possibile applicare l'attributo PrincipalPermissionAttribute a un metodo. Il costruttore per l'attributo è obsoleto e genera un errore in fase di compilazione. A differenza di altri avvisi obsoleti, non è possibile eliminare l'errore.

Motivo della modifica

Il tipo PrincipalPermissionAttribute, come altri tipi che creano sottoclassi di SecurityAttribute, fa parte dell'infrastruttura di sicurezza dall'accesso di codice (CAS, Code Access Security) di NET. In .NET Framework 2.x - 4.x il runtime applica annotazioni PrincipalPermissionAttribute all'ingresso del metodo, anche se l'applicazione è in esecuzione in uno scenario con attendibilità totale. .NET Core e .NET 5 e versioni successive non supportano gli attributi CAS e il runtime li ignora.

Questa differenza nel comportamento da .NET Framework a .NET Core e .NET 5 può causare uno scenario di "apertura non riuscita", in cui l'accesso avrebbe dovuto essere bloccato ma invece è stato consentito. Per evitare lo scenario di "apertura non riuscita", non è più possibile applicare l'attributo nel codice destinato a .NET 5 o versione successiva.

Versione di introduzione

5.0

Se si riscontra l'errore di obsolescenza, è necessario intervenire.

  • Se si applica l'attributo a un metodo di azione MVC ASP.NET:

    Prendere in considerazione l'uso dell'infrastruttura di autorizzazione predefinita di ASP.NET. Il codice seguente illustra come annotare un controller con un attributo AuthorizeAttribute. Il runtime ASP.NET autorizzerà l'utente prima di eseguire l'azione.

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

    Per altre informazioni, vedere Autorizzazione basata sui ruoli in ASP.NET Core e Introduzione all'autorizzazione in ASP.NET Core.

  • Se si applica l'attributo al codice della libreria all'esterno del contesto di un'app Web:

    Eseguire manualmente i controlli all'inizio del metodo. Questa operazione può essere eseguita usando il metodo 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 interessate