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

Cuando se crea una identidad se pueden asignar una o más notificaciones emitidas por una entidad de confianza.When an identity is created it may be assigned one or more claims issued by a trusted party. Una notificación es un par nombre-valor que representa el asunto de qué es, no lo que el sujeto puede hacer.A claim is a name value pair that represents what the subject is, not what the subject can do. Por ejemplo, puede tener un permiso de conducir, emitido por una entidad de licencia de conducción local.For example, you may have a driver's license, issued by a local driving license authority. De conducir su permiso tiene su fecha de nacimiento.Your driver's license has your date of birth on it. En este caso sería el nombre de la notificación DateOfBirth, el valor de notificación sería su fecha de nacimiento, por ejemplo 8th June 1970 y el emisor sería la autoridad de licencia de conducción.In this case the claim name would be DateOfBirth, the claim value would be your date of birth, for example 8th June 1970 and the issuer would be the driving license authority. Autorización basada en notificaciones, en su forma más simple, comprueba el valor de una notificación y permite el acceso a un recurso en función de ese valor.Claims based authorization, at its simplest, checks the value of a claim and allows access to a resource based upon that value. Por ejemplo, si desea que el proceso de autorización el acceso a un club nocturno puede ser:For example if you want access to a night club the authorization process might be:

El responsable de la seguridad de la puerta evaluaría el valor de la fecha de nacimiento notificación y si confía en el emisor (la entidad de licencia conducción) antes de conceder que acceso.The door security officer would evaluate the value of your date of birth claim and whether they trust the issuer (the driving license authority) before granting you access.

Una identidad puede contener varias notificaciones con varios valores y puede contener varias notificaciones del mismo tipo.An identity can contain multiple claims with multiple values and can contain multiple claims of the same type.

Agregar comprobaciones de notificacionesAdding claims checks

Notificación de comprobaciones de autorización basado en son declarativas: el desarrollador incrusta dentro de su código, con un controlador o una acción dentro de un controlador, especificar las notificaciones que debe poseer el usuario actual y, opcionalmente, debe contener el valor de la notificación para tener acceso a la recurso solicitado.Claim based authorization checks are declarative - the developer embeds them within their code, against a controller or an action within a controller, specifying claims which the current user must possess, and optionally the value the claim must hold to access the requested resource. Notificaciones de los requisitos son basada en directivas, el desarrollador debe crear y registrar una directiva de expresar los requisitos de notificaciones.Claims requirements are policy based, the developer must build and register a policy expressing the claims requirements.

El tipo más sencillo de directiva Busca la presencia de una notificación de notificación y no comprueba el valor.The simplest type of claim policy looks for the presence of a claim and doesn't check the value.

Primero deberá crear y registrar la directiva.First you need to build and register the policy. Esta operación se realiza como parte de la configuración del servicio de autorización, que normalmente forma parte de ConfigureServices() en su Startup.cs archivo.This takes place as part of the Authorization service configuration, which normally takes part in ConfigureServices() in your Startup.cs file.

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

    services.AddAuthorization(options =>
    {
        options.AddPolicy("EmployeeOnly", policy => policy.RequireClaim("EmployeeNumber"));
    });
}

En este caso el EmployeeOnly directiva comprueba la presencia de un EmployeeNumber de notificación de la identidad actual.In this case the EmployeeOnly policy checks for the presence of an EmployeeNumber claim on the current identity.

A continuación, aplicar la directiva con la Policy propiedad en el AuthorizeAttribute atributo para especificar el nombre de la directiva;You then apply the policy using the Policy property on the AuthorizeAttribute attribute to specify the policy name;

[Authorize(Policy = "EmployeeOnly")]
public IActionResult VacationBalance()
{
    return View();
}

El AuthorizeAttribute atributo puede aplicarse a un controlador todo, en este caso solo las identidades de la directiva de coincidencia se permitirá acceso a cualquier acción en el controlador.The AuthorizeAttribute attribute can be applied to an entire controller, in this instance only identities matching the policy will be allowed access to any Action on the controller.

[Authorize(Policy = "EmployeeOnly")]
public class VacationController : Controller
{
    public ActionResult VacationBalance()
    {
    }
}

Si tiene un controlador que está protegido por la AuthorizeAttribute de atributo, pero desea permitir el acceso anónimo a acciones concretas que se aplica los AllowAnonymousAttribute atributo.If you have a controller that's protected by the AuthorizeAttribute attribute, but want to allow anonymous access to particular actions you apply the AllowAnonymousAttribute attribute.

[Authorize(Policy = "EmployeeOnly")]
public class VacationController : Controller
{
    public ActionResult VacationBalance()
    {
    }

    [AllowAnonymous]
    public ActionResult VacationPolicy()
    {
    }
}

La mayoría de las notificaciones incluyen un valor.Most claims come with a value. Puede especificar una lista de valores permitidos al crear la directiva.You can specify a list of allowed values when creating the policy. El ejemplo siguiente se realizaría correctamente sólo para los empleados cuyo número de empleado era 1, 2, 3, 4 o 5.The following example would only succeed for employees whose employee number was 1, 2, 3, 4 or 5.

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

    services.AddAuthorization(options =>
    {
        options.AddPolicy("Founders", policy =>
                          policy.RequireClaim("EmployeeNumber", "1", "2", "3", "4", "5"));
    });
}

Agregar una comprobación de solicitud genéricoAdd a generic claim check

Si el valor de notificación no es un valor único o una transformación es necesaria, utilice RequireAssertion.If the claim value isn't a single value or a transformation is required, use RequireAssertion. Para obtener más información, consulte mediante func para satisfacer una directiva.For more information, see Using a func to fulfill a policy.

Evaluación de directiva múltiplesMultiple Policy Evaluation

Si varias directivas se aplican a un controlador o acción, todas las directivas deben pasar antes de que se concede acceso.If you apply multiple policies to a controller or action, then all policies must pass before access is granted. Por ejemplo:For example:

[Authorize(Policy = "EmployeeOnly")]
public class SalaryController : Controller
{
    public ActionResult Payslip()
    {
    }

    [Authorize(Policy = "HumanResources")]
    public ActionResult UpdateSalary()
    {
    }
}

En el ejemplo anterior cualquier identidad que cumple el EmployeeOnly directiva puede tener acceso a la Payslip acción como esa directiva se aplica en el controlador.In the above example any identity which fulfills the EmployeeOnly policy can access the Payslip action as that policy is enforced on the controller. Sin embargo para poder llamar a la UpdateSalary acción debe cumplir la identidad ambos el EmployeeOnly directiva y la HumanResources directiva.However in order to call the UpdateSalary action the identity must fulfill both the EmployeeOnly policy and the HumanResources policy.

Si desea que las directivas más complicadas, como llevar a cabo una fecha de nacimiento notificación, calcular una edad de él, a continuación, comprobar la edad es 21 o una versión anterior, deberá escribir controladores de directiva personalizada.If you want more complicated policies, such as taking a date of birth claim, calculating an age from it then checking the age is 21 or older then you need to write custom policy handlers.