Autorizzazione basata sulle attestazioni in ASP.NET CoreClaims-based authorization in ASP.NET Core

Quando viene creata un'identità, è possibile che venga assegnata una o più attestazioni rilasciate da un'entità attendibile.When an identity is created it may be assigned one or more claims issued by a trusted party. Un'attestazione è una coppia nome-valore che rappresenta il tipo di oggetto, non ciò che può fare l'oggetto.A claim is a name value pair that represents what the subject is, not what the subject can do. È possibile, ad esempio, che si disponga di una licenza di un driver, emessa da un'autorità di licenza di guida locale.For example, you may have a driver's license, issued by a local driving license authority. La licenza del driver ha la data di nascita.Your driver's license has your date of birth on it. In questo caso il nome dell'attestazione sarà DateOfBirth, il valore dell'attestazione è la data di nascita, ad esempio 8th June 1970 e l'emittente sarà l'autorità di licenza di guida.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. L'autorizzazione basata sulle attestazioni, alla sua più semplice, controlla il valore di un'attestazione e consente l'accesso a una risorsa in base a tale valore.Claims based authorization, at its simplest, checks the value of a claim and allows access to a resource based upon that value. Se ad esempio si vuole accedere a un night club, il processo di autorizzazione potrebbe essere:For example if you want access to a night club the authorization process might be:

Il responsabile della sicurezza di sportello valuterebbe il valore della data di attestazione di nascita e se considera attendibile l'autorità emittente (l'autorità di certificazione di guida) prima di concedere l'accesso.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.

Un'identità può contenere più attestazioni con più valori e può contenere più attestazioni dello stesso tipo.An identity can contain multiple claims with multiple values and can contain multiple claims of the same type.

Aggiunta di controlli delle attestazioniAdding claims checks

I controlli delle autorizzazioni basate su attestazioni sono dichiarativi. lo sviluppatore li incorpora all'interno del codice, a fronte di un controller o di un'azione all'interno di un controller, specificando attestazioni che l'utente corrente deve possedere e, facoltativamente, il valore che l'attestazione deve tenere per accedere al risorsa richiesta.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. I requisiti di attestazione sono basati su criteri, lo sviluppatore deve compilare e registrare un criterio che esprime i requisiti di attestazione.Claims requirements are policy based, the developer must build and register a policy expressing the claims requirements.

Il tipo più semplice di criteri di attestazione cerca la presenza di un'attestazione e non verifica il valore.The simplest type of claim policy looks for the presence of a claim and doesn't check the value.

Prima di tutto è necessario compilare e registrare i criteri.First you need to build and register the policy. Questo avviene come parte della configurazione del servizio di autorizzazione, che in genere fa parte ConfigureServices() nel file Startup.cs .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.AddControllersWithViews();
    services.AddRazorPages();

    services.AddAuthorization(options =>
    {
        options.AddPolicy("EmployeeOnly", policy => policy.RequireClaim("EmployeeNumber"));
    });
}
public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();

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

In questo caso i criteri di EmployeeOnly verificano la presenza di un'attestazione EmployeeNumber sull'identità corrente.In this case the EmployeeOnly policy checks for the presence of an EmployeeNumber claim on the current identity.

Applicare quindi il criterio usando la proprietà Policy sull'attributo AuthorizeAttribute per specificare il nome del criterio;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();
}

L'attributo AuthorizeAttribute può essere applicato a un intero controller, in questo caso solo le identità che corrispondono ai criteri saranno autorizzate ad accedere a qualsiasi azione nel controller.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()
    {
    }
}

Se si dispone di un controller protetto dall'attributo AuthorizeAttribute, ma si desidera consentire l'accesso anonimo a determinate azioni, si applica l'attributo AllowAnonymousAttribute.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()
    {
    }
}

Per la maggior parte delle attestazioni viene aggiunto un valore.Most claims come with a value. È possibile specificare un elenco di valori consentiti durante la creazione del criterio.You can specify a list of allowed values when creating the policy. L'esempio seguente ha esito positivo solo per i dipendenti il cui numero di dipendente è 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.AddControllersWithViews();
    services.AddRazorPages();

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

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

Aggiungere un controllo di attestazione genericoAdd a generic claim check

Se il valore dell'attestazione non è un singolo valore o se è richiesta una trasformazione, utilizzare RequireAssertion.If the claim value isn't a single value or a transformation is required, use RequireAssertion. Per ulteriori informazioni, vedere utilizzo di una funzione Func per soddisfare i criteri.For more information, see Using a func to fulfill a policy.

Valutazione di più criteriMultiple Policy Evaluation

Se si applicano più criteri a un controller o a un'azione, tutti i criteri devono essere superati prima che venga concesso l'accesso.If you apply multiple policies to a controller or action, then all policies must pass before access is granted. Esempio:For example:

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

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

Nell'esempio precedente qualsiasi identità che soddisfi i criteri di EmployeeOnly può accedere all'azione Payslip poiché tale criterio viene applicato nel controller.In the above example any identity which fulfills the EmployeeOnly policy can access the Payslip action as that policy is enforced on the controller. Tuttavia, per chiamare l'azione UpdateSalary l'identità deve soddisfare sia i criteri di EmployeeOnly che i criteri di HumanResources.However in order to call the UpdateSalary action the identity must fulfill both the EmployeeOnly policy and the HumanResources policy.

Se si desiderano criteri più complessi, ad esempio l'acquisizione di una data di attestazione di nascita, il calcolo di un periodo di tempo da esso, il controllo dell'età è 21 o precedente, è necessario scrivere gestori di criteri personalizzati.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.