Autorização baseada em função no ASP.NET Core

Quando uma identidade é criada, ela pode pertencer a uma ou mais funções. Por exemplo, Tracy pode pertencer ao administrador e às funções de usuário, enquanto Scott só pode pertencer à função de usuário. A forma como essas funções são criadas e gerenciadas depende do armazenamento de backup do processo de autorização. As funções são expostas ao desenvolvedor por meio do método IsInRole na classe ClaimsPrincipal .

Adicionando verificações de função

As verificações de autorização baseadas em função são declarativas — que o desenvolvedor as insere em seu código, em um controlador ou em uma ação dentro de um controlador, especificando funções das quais o usuário atual deve ser membro para acessar o recurso solicitado.

Por exemplo, o código a seguir limita o acesso a qualquer ação no AdministrationController para os usuários que são membros da Administrator função:

[Authorize(Roles = "Administrator")]
public class AdministrationController : Controller
{
}

Você pode especificar várias funções como uma lista separada por vírgulas:

[Authorize(Roles = "HRManager,Finance")]
public class SalaryController : Controller
{
}

Esse controlador só poderá ser acessado por usuários que são membros da HRManager função ou da Finance função.

Se você aplicar vários atributos, um usuário de acesso deverá ser um membro de todas as funções especificadas; o exemplo a seguir requer que um usuário seja membro de ambas as PowerUser funções e ControlPanelUser .

[Authorize(Roles = "PowerUser")]
[Authorize(Roles = "ControlPanelUser")]
public class ControlPanelController : Controller
{
}

Você pode limitar ainda mais o acesso aplicando atributos de autorização de função adicionais no nível de ação:

[Authorize(Roles = "Administrator, PowerUser")]
public class ControlPanelController : Controller
{
    public ActionResult SetTime()
    {
    }

    [Authorize(Roles = "Administrator")]
    public ActionResult ShutDown()
    {
    }
}

No trecho de código anterior, os membros da Administrator função ou a PowerUser função podem acessar o controlador e a SetTime ação, mas somente os membros da Administrator função podem acessar a ShutDown ação.

Você também pode bloquear um controlador, mas permitir acesso anônimo e não autenticado a ações individuais.

[Authorize]
public class ControlPanelController : Controller
{
    public ActionResult SetTime()
    {
    }

    [AllowAnonymous]
    public ActionResult Login()
    {
    }
}

Para Razor páginas, o AuthorizeAttribute pode ser aplicado por um dos dois:

  • Usando uma Convençãoou
  • Aplicando o AuthorizeAttribute à PageModel instância:
[Authorize(Policy = "RequireAdministratorRole")]
public class UpdateModel : PageModel
{
    public ActionResult OnPost()
    {
    }
}

Importante

Os atributos de filtro, incluindo AuthorizeAttribute , só podem ser aplicados a PageModel e não podem ser aplicados a métodos de manipuladores de páginas específicos.

Verificações de função baseadas em políticas

Os requisitos de função também podem ser expressos usando a nova sintaxe de Política, em que um desenvolvedor registra uma política na inicialização como parte da configuração do serviço de autorização. Isso normalmente ocorre no ConfigureServices() arquivo Startup.cs.

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();
    services.AddRazorPages();

    services.AddAuthorization(options =>
    {
        options.AddPolicy("RequireAdministratorRole",
             policy => policy.RequireRole("Administrator"));
    });
}
public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();

    services.AddAuthorization(options =>
    {
        options.AddPolicy("RequireAdministratorRole",
             policy => policy.RequireRole("Administrator"));
    });
}

As políticas são aplicadas usando Policy a propriedade no atributo AuthorizeAttribute :

[Authorize(Policy = "RequireAdministratorRole")]
public IActionResult Shutdown()
{
    return View();
}

Se você quiser especificar várias funções permitidas em um requisito, poderá especificá-las como parâmetros para o RequireRole método :

options.AddPolicy("ElevatedRights", policy =>
                  policy.RequireRole("Administrator", "PowerUser", "BackupAdministrator"));

Este exemplo autoriza os usuários que pertencem às Administrator funções ou PowerUser BackupAdministrator .

Adicionar serviços de função ao Identity

Acrescentar AddRoles para adicionar serviços de função:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));
    services.AddDefaultIdentity<IdentityUser>()
        .AddRoles<IdentityRole>()
        .AddEntityFrameworkStores<ApplicationDbContext>();

    services.AddControllersWithViews();
    services.AddRazorPages();
}
public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));
    services.AddDefaultIdentity<IdentityUser>()
        .AddRoles<IdentityRole>()
        .AddDefaultUI(UIFramework.Bootstrap4)
        .AddEntityFrameworkStores<ApplicationDbContext>();

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}