Share via


PrincipalPermissionAttribute está obsoleto e produz um erro

O construtor PrincipalPermissionAttribute está obsoleto e produz um erro em tempo de compilação. Não é possível instanciar esse atributo ou aplicá-lo a um método.

Descrição das alterações

No .NET Framework e no .NET Core, você pode anotar métodos com o atributo PrincipalPermissionAttribute. Por exemplo:

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

A partir do .NET 5, você não pode aplicar o atributo PrincipalPermissionAttribute a um método. O construtor para o atributo está obsoleto e produz um erro em tempo de compilação. Ao contrário de outros avisos de obsolescência, você não pode suprimir esse erro.

Motivo da alteração

O tipo PrincipalPermissionAttribute, como outros tipos que fazem parte da subclasse SecurityAttribute, faz parte infraestrutura de segurança de acesso do código do .NET (CAS). No .NET Framework 2.x – 4.x, o runtime impõe anotações PrincipalPermissionAttribute na entrada do método, mesmo que o aplicativo esteja em execução em um cenário de confiança total. O .NET Core e o .NET 5 e posteriores não dão suporte a atributos de CAS e o runtime os ignora.

Essa diferença no comportamento do .NET Framework para o .NET Core e o .NET 5 pode resultar em um cenário de "fail open", em que o acesso deveria ter sido bloqueado, mas, em vez disso, foi permitido. Para evitar o cenário de "fail open", você não pode mais aplicar o atributo no código direcionado ao .NET 5 ou posterior.

Versão introduzida

5,0

Se você encontrar o erro de obsolescência, deverá executar uma ação.

  • Se você estiver aplicando o atributo a um método de ação do ASP.NET MVC:

    Considere usar a infraestrutura de autorização interna do ASP.NET. O código a seguir demonstra como anotar um controlador com um atributo AuthorizeAttribute. O runtime do ASP.NET autorizará o usuário antes de executar a ação.

    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 obter mais informações, consulte a Autorização baseada em função no ASP.NET Core e a Introdução à autorização no ASP.NET Core.

  • Se você estiver aplicando o atributo ao código de biblioteca fora do contexto de um aplicativo Web:

    Execute as verificações manualmente no início do método. Isso pode ser feito usando o método 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.
    }
    

APIs afetadas