Autorización basada en roles en ASP.NET CoreRole-based authorization in ASP.NET Core

Cuando se crea una identidad puede pertenecer a uno o varios roles.When an identity is created it may belong to one or more roles. Por ejemplo, mujer puede pertenecer a los roles de administrador y usuario mientras Scott solo puede pertenecer al rol de usuario.For example, Tracy may belong to the Administrator and User roles whilst Scott may only belong to the User role. Cómo se crean y administran estas funciones depende del almacén de respaldo del proceso de autorización.How these roles are created and managed depends on the backing store of the authorization process. Las funciones se exponen a los desarrolladores a través de la IsInRole método en el ClaimsPrincipal clase.Roles are exposed to the developer through the IsInRole method on the ClaimsPrincipal class.

Agregar comprobaciones de la funciónAdding role checks

Comprobaciones de autorización basada en roles son declarativas—el desarrollador incrusta dentro de su código, con un controlador o una acción dentro de un controlador, especificar las funciones que el usuario actual debe ser miembro de tener acceso al recurso solicitado.Role-based authorization checks are declarative—the developer embeds them within their code, against a controller or an action within a controller, specifying roles which the current user must be a member of to access the requested resource.

Por ejemplo, el siguiente código limita el acceso a todas las acciones en el AdministrationController a los usuarios que son miembros de la Administrator rol:For example, the following code limits access to any actions on the AdministrationController to users who are a member of the Administrator role:

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

Puede especificar varios roles como una lista separada por comas:You can specify multiple roles as a comma separated list:

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

Este controlador sería sólo puede tener acceso a los usuarios que son miembros de la HRManager rol o la Finance rol.This controller would be only accessible by users who are members of the HRManager role or the Finance role.

Si aplica varios atributos de un usuario que obtiene acceso debe ser miembro de todas las funciones especificadas; el ejemplo siguiente requiere que un usuario debe ser miembro de la PowerUser y ControlPanelUser rol.If you apply multiple attributes then an accessing user must be a member of all the roles specified; the following sample requires that a user must be a member of both the PowerUser and ControlPanelUser role.

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

Puede limitar aún más el acceso aplicando los atributos de autorización de rol adicionales en el nivel de acción:You can further limit access by applying additional role authorization attributes at the action level:

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

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

En los miembros de fragmento de código anterior de la Administrator rol o la PowerUser rol puede acceder al controlador y el SetTime acción, pero solo los miembros de la Administrator rol puede tener acceso el ShutDown acción.In the previous code snippet members of the Administrator role or the PowerUser role can access the controller and the SetTime action, but only members of the Administrator role can access the ShutDown action.

También puede bloquear un controlador, pero permitir el acceso anónimo, no autenticado a acciones individuales.You can also lock down a controller but allow anonymous, unauthenticated access to individual actions.

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

    [AllowAnonymous]
    public ActionResult Login()
    {
    }
}

Para las páginas de Razor, el AuthorizeAttribute puede aplicarse, ya sea por:For Razor Pages, the AuthorizeAttribute can be applied by either:

  • Mediante un convención, oUsing a convention, or
  • Aplicar el AuthorizeAttribute a la PageModel instancia:Applying the AuthorizeAttribute to the PageModel instance:
[Authorize(Policy = "RequireAdministratorRole")]
public class UpdateModel : PageModel
{
    public ActionResult OnPost()
    {
    }
}

Importante

Filtrar los atributos, como AuthorizeAttribute, sólo puede aplicarse a PageModel y no se puede aplicar a métodos de controlador de página específica.Filter attributes, including AuthorizeAttribute, can only be applied to PageModel and cannot be applied to specific page handler methods.

Comprobaciones de la función basada en directivasPolicy based role checks

Requisitos del rol también se pueden expresar utilizando la sintaxis de directiva nueva, donde el desarrollador registra una directiva en el inicio como parte de la configuración del servicio de autorización.Role requirements can also be expressed using the new Policy syntax, where a developer registers a policy at startup as part of the Authorization service configuration. Normalmente, esto ocurre en ConfigureServices() en su Startup.cs archivo.This normally occurs in ConfigureServices() in your Startup.cs file.

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();

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

Las directivas se aplican mediante el Policy propiedad en el AuthorizeAttribute atributo:Policies are applied using the Policy property on the AuthorizeAttribute attribute:

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

Si desea especificar varios roles permitidos en un requisito, puede especificarlas como parámetros a la RequireRole método:If you want to specify multiple allowed roles in a requirement then you can specify them as parameters to the RequireRole method:

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

En este ejemplo, autoriza a los usuarios que pertenecen a la Administrator, PowerUser o BackupAdministrator roles.This example authorizes users who belong to the Administrator, PowerUser or BackupAdministrator roles.

Agregar servicios de función a la identidadAdd Role services to Identity

Anexar AddRoles para agregar servicios de rol:Append AddRoles to add Role services:

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);
}