Compartir a través de


PrincipalPermissionAttribute está obsoleto como error

El PrincipalPermissionAttribute constructor está obsoleto y genera un error en tiempo de compilación. No se puede crear una instancia de este atributo ni aplicarlo a un método .

Descripción del cambio

En .NET Framework y .NET Core, puede anotar métodos con el PrincipalPermissionAttribute atributo . Por ejemplo:

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

A partir de .NET 5, no se puede aplicar el PrincipalPermissionAttribute atributo a un método . El constructor del atributo está obsoleto y genera un error en tiempo de compilación. A diferencia de otras advertencias de obsolescencia, no se puede suprimir el error.

Motivo del cambio

El tipo PrincipalPermissionAttribute, como otros tipos que colocan SecurityAttribute como subclase, forma parte de la infraestructura de seguridad de acceso del código (CAS) de .NET. En .NET Framework 2.x - 4.x, el entorno de ejecución aplica PrincipalPermissionAttribute anotaciones en la entrada del método, incluso si la aplicación se ejecuta en un escenario de plena confianza. .NET Core y .NET 5 y versiones posteriores no admiten atributos CAS y el entorno de ejecución los omite.

Esta diferencia en el comportamiento de .NET Framework a .NET Core y .NET 5 puede dar lugar a un escenario de "fallo abierto", donde el acceso debería haberse bloqueado, pero en su lugar se ha permitido. Para evitar el escenario de "fail open", ya no se puede aplicar el atributo en código dirigido a .NET 5 o posterior.

Versión introducida

5.0

Si se produce el error de obsolescencia, debe tomar medidas.

  • Si va a aplicar el atributo a un método de acción ASP.NET MVC:

    Considere la posibilidad de usar la infraestructura de autorización integrada de ASP.NET. En el código siguiente se muestra cómo anotar un controlador con un AuthorizeAttribute atributo . El entorno de ejecución de ASP.NET autorizará al usuario antes de realizar la acción.

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

    Para obtener más información, consulte Autorización basada en roles en ASP.NET Core e Introducción a la autorización en ASP.NET Core.

  • Si va a aplicar el atributo al código de biblioteca fuera del contexto de una aplicación web:

    Realice las comprobaciones manualmente al principio del método. Esto se puede hacer mediante el IPrincipal.IsInRole(String) método .

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

Las APIs afectadas