Autorisation basée sur les revendications dans ASP.NET Core

Lors de la création d’une identité, une ou plusieurs revendications émises par une partie de confiance peuvent lui être attribuées. Une revendication est une paire valeur de nom qui représente ce que l’objet est, et non ce que le sujet peut faire. Par exemple, vous pouvez avoir un permis de conduire, délivré par une autorité locale de permis de conduire. Votre permis de conduire contient votre date de naissance. Dans ce cas, le nom de la revendication serait DateOfBirth, la valeur de la revendication serait votre date de naissance, par exemple 8th June 1970 et l’émetteur serait l’autorité du permis de conduire. L’autorisation basée sur les revendications, au plus simple, vérifie la valeur d’une revendication et autorise l’accès à une ressource en fonction de cette valeur. Par exemple, si vous souhaitez accéder à une boîte de nuit, le processus d’autorisation peut être :

L’agent de sécurité de porte évalue la valeur de votre demande de date de naissance et s’il fait confiance à l’émetteur (l’autorité du permis de conduire) avant de vous accorder l’accès.

Une identité peut contenir plusieurs revendications avec plusieurs valeurs et peut contenir plusieurs revendications du même type.

Ajout de vérifications de revendications

Vérifications d’autorisation basées sur les revendications :

  • Sont déclaratifs.
  • Sont appliqués aux Pages Razor, aux contrôleurs ou aux actions au sein d’un contrôleur.
  • Ne peuvent pas être appliqués au niveau du Razor gestionnaire de pages, ils doivent être appliqués à la page.

Les revendications dans le code spécifient les revendications que l’utilisateur actuel doit posséder, et éventuellement la valeur que la revendication doit détenir pour accéder à la ressource demandée. Les exigences en matière de revendications sont basées sur une stratégie. Le développeur doit générer et inscrire une stratégie exprimant les exigences des revendications.

Le type de stratégie de revendication le plus simple recherche la présence d’une revendication et ne vérifie pas la valeur.

Générez et inscrivez la stratégie et appelez UseAuthorization. L’inscription de la stratégie s’effectue dans le cadre de la configuration du service d’autorisation, généralement dans le fichier Program.cs :

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

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

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseAuthentication();
app.UseAuthorization();

app.MapDefaultControllerRoute();
app.MapRazorPages();

app.Run();

Dans ce cas, la stratégie EmployeeOnly vérifie la présence d’une revendication EmployeeNumber sur l’identité actuelle.

Appliquez la stratégie à l’aide de la Policy propriété sur l’attribut [Authorize] pour spécifier le nom de la stratégie.

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

L’attribut [Authorize] peut être appliqué à l’ensemble d’un contrôleur ou d’une page Razor, auquel cas seules les identités correspondant à la stratégie sont autorisées à accéder à une action sur le contrôleur.

[Authorize(Policy = "EmployeeOnly")]
public class VacationController : Controller
{
    public IActionResult Index()
    {
        return View();
    }

    public ActionResult VacationBalance()
    {
        return View();
    }

    [AllowAnonymous]
    public ActionResult VacationPolicy()
    {
        return View();
    }
}

Le code suivant applique l’attribut [Authorize] à une Razor page :

[Authorize(Policy = "EmployeeOnly")]
public class IndexModel : PageModel
{
    public void OnGet()
    {

    }
}

Les stratégies ne peuvent pas être appliqués au niveau du Razor gestionnaire de pages, ils doivent être appliqués à la page.

Si vous avez un contrôleur protégé par l’attribut, mais que vous souhaitez autoriser l’accès [Authorize] anonyme à des actions particulières, vous appliquez l’attribut AllowAnonymousAttribute.

[Authorize(Policy = "EmployeeOnly")]
public class VacationController : Controller
{
    public IActionResult Index()
    {
        return View();
    }

    public ActionResult VacationBalance()
    {
        return View();
    }

    [AllowAnonymous]
    public ActionResult VacationPolicy()
    {
        return View();
    }
}

Étant donné que les stratégies ne peuvent pas être appliquées au niveau du Razor gestionnaire de pages, nous vous recommandons d’utiliser un contrôleur lorsque des stratégies doivent être appliquées au niveau du gestionnaire de pages. Le reste de l’application qui ne nécessite pas de stratégies au niveau du Razor gestionnaire de pages peut utiliser Razor Pages.

La plupart des revendications sont fournies avec une valeur. Vous pouvez spécifier une liste de valeurs autorisées lors de la création de la stratégie. L’exemple suivant ne réussirait que pour les employés dont le nombre d’employés était 1, 2, 3, 4 ou 5.

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

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

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseAuthentication();
app.UseAuthorization();

app.MapDefaultControllerRoute();
app.MapRazorPages();

app.Run();

Ajouter un contrôle générique de la demande

Si la valeur de revendication n’est pas une valeur unique ou si une transformation est requise, utilisez RequireAssertion. Pour plus d’informations, consultez Utiliser un func pour remplir une stratégie.

Évaluation de plusieurs stratégies

Si plusieurs stratégies sont appliquées au niveau du contrôleur et de l’action, toutes les stratégies doivent passer avant que l’accès soit accordé :

[Authorize(Policy = "EmployeeOnly")]
public class SalaryController : Controller
{
    public IActionResult Index()
    {
        return View();
    }

    public IActionResult Payslip()
    {
        return View();
    }

    [Authorize(Policy = "HumanResources")]
    public IActionResult UpdateSalary()
    {
        return View();
    }
}

Dans l’exemple précédent, toute identité qui respecte la EmployeeOnly stratégie peut accéder à l’action Payslip car cette stratégie est appliquée au contrôleur. Toutefois, pour appeler l’action UpdateSalary, l’identité doit remplir à la fois la stratégie EmployeeOnly et la stratégie HumanResources.

Si vous souhaitez des stratégies plus complexes, telles que la prise en compte d’une date de naissance, le calcul d’un âge à partir de celle-ci et la vérification que l’âge est de 21 ans ou plus, vous devez écrire des gestionnaires de stratégies personnalisés.

Dans l’exemple suivant, les deux méthodes de gestionnaire de pages doivent respecter à la fois la stratégie EmployeeOnlyet la stratégie HumanResources :

[Authorize(Policy = "EmployeeOnly")]
[Authorize(Policy = "HumanResources")]
public class SalaryModel : PageModel
{
    public ContentResult OnGetPayStub()
    {
        return Content("OnGetPayStub");
    }

    public ContentResult OnGetSalary()
    {
        return Content("OnGetSalary");
    }
}

Lors de la création d’une identité, une ou plusieurs revendications émises par une partie de confiance peuvent lui être attribuées. Une revendication est une paire valeur de nom qui représente ce que l’objet est, et non ce que le sujet peut faire. Par exemple, vous pouvez avoir un permis de conduire, délivré par une autorité locale de permis de conduire. Votre permis de conduire contient votre date de naissance. Dans ce cas, le nom de la revendication serait DateOfBirth, la valeur de la revendication serait votre date de naissance, par exemple 8th June 1970 et l’émetteur serait l’autorité du permis de conduire. L’autorisation basée sur les revendications, au plus simple, vérifie la valeur d’une revendication et autorise l’accès à une ressource en fonction de cette valeur. Par exemple, si vous souhaitez accéder à une boîte de nuit, le processus d’autorisation peut être :

L’agent de sécurité de porte évalue la valeur de votre demande de date de naissance et s’il fait confiance à l’émetteur (l’autorité du permis de conduire) avant de vous accorder l’accès.

Une identité peut contenir plusieurs revendications avec plusieurs valeurs et peut contenir plusieurs revendications du même type.

Ajout de vérifications de revendications

Les vérifications d’autorisation basées sur les revendications sont déclaratives : le développeur les incorpore dans son code, sur un contrôleur ou sur une action au sein d’un contrôleur, en spécifiant les revendications que l’utilisateur actuel doit posséder et éventuellement la valeur que la revendication doit détenir pour accéder à la ressource demandée. Les exigences en matière de revendications sont basées sur une stratégie. Le développeur doit générer et inscrire une stratégie exprimant les exigences des revendications.

Le type de stratégie de revendication le plus simple recherche la présence d’une revendication et ne vérifie pas la valeur.

Générez et inscrivez la stratégie. Cela se produit dans le cadre de la configuration du service d’autorisation, qui participe normalement à ConfigureServices() dans votre fichier Startup.cs.

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

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

Appelez UseAuthorization dans Configure. Le code suivant est généré par les modèles d’application web ASP.NET Core :

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseMigrationsEndPoint();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseRouting();

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
    });
}

Dans ce cas, la stratégie EmployeeOnly vérifie la présence d’une revendication EmployeeNumber sur l’identité actuelle.

Vous appliquez ensuite la stratégie à l’aide de la propriété Policy sur l’attribut [Authorize] pour spécifier le nom de la stratégie ;

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

L’attribut [Authorize] peut être appliqué à un contrôleur entier, dans cette instance seules les identités correspondant à la stratégie seront autorisées à accéder à une action sur le contrôleur.

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

Si vous avez un contrôleur protégé par l’attribut, mais que vous souhaitez autoriser l’accès [Authorize] anonyme à des actions particulières, vous appliquez l’attribut AllowAnonymousAttribute.

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

    [AllowAnonymous]
    public ActionResult VacationPolicy()
    {
    }
}

La plupart des revendications sont fournies avec une valeur. Vous pouvez spécifier une liste de valeurs autorisées lors de la création de la stratégie. L’exemple suivant ne réussirait que pour les employés dont le nombre d’employés était 1, 2, 3, 4 ou 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"));
    });
}

Ajouter un contrôle générique de la demande

Si la valeur de revendication n’est pas une valeur unique ou si une transformation est requise, utilisez RequireAssertion. Pour plus d’informations, consultez Utiliser un func pour remplir une stratégie.

Évaluation de plusieurs stratégies

Si vous appliquez plusieurs stratégies à un contrôleur ou à une action, toutes les stratégies doivent passer avant que l’accès soit accordé. Par exemple :

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

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

Dans l’exemple ci-dessus, toute identité qui respecte la stratégie EmployeeOnly peut accéder à l’action Payslip car cette stratégie est appliquée au contrôleur. Toutefois, pour appeler l’action UpdateSalary, l’identité doit remplir à la fois la stratégie EmployeeOnly et la stratégie HumanResources.

Si vous souhaitez des stratégies plus complexes, telles que la prise d’une demande de date de naissance, le calcul d’un âge à partir de celle-ci, puis la vérification de l’âge de 21 ans ou plus, vous devez écrire des gestionnaires de stratégies personnalisés.

Lors de la création d’une identité, une ou plusieurs revendications émises par une partie de confiance peuvent lui être attribuées. Une revendication est une paire valeur de nom qui représente ce que l’objet est, et non ce que le sujet peut faire. Par exemple, vous pouvez avoir un permis de conduire, délivré par une autorité locale de permis de conduire. Votre permis de conduire contient votre date de naissance. Dans ce cas, le nom de la revendication serait DateOfBirth, la valeur de la revendication serait votre date de naissance, par exemple 8th June 1970 et l’émetteur serait l’autorité du permis de conduire. L’autorisation basée sur les revendications, au plus simple, vérifie la valeur d’une revendication et autorise l’accès à une ressource en fonction de cette valeur. Par exemple, si vous souhaitez accéder à une boîte de nuit, le processus d’autorisation peut être :

L’agent de sécurité de porte évalue la valeur de votre demande de date de naissance et s’il fait confiance à l’émetteur (l’autorité du permis de conduire) avant de vous accorder l’accès.

Une identité peut contenir plusieurs revendications avec plusieurs valeurs et peut contenir plusieurs revendications du même type.

Ajout de vérifications de revendications

Les vérifications d’autorisation basées sur les revendications sont déclaratives : le développeur les incorpore dans son code, sur un contrôleur ou sur une action au sein d’un contrôleur, en spécifiant les revendications que l’utilisateur actuel doit posséder et éventuellement la valeur que la revendication doit détenir pour accéder à la ressource demandée. Les exigences en matière de revendications sont basées sur une stratégie. Le développeur doit générer et inscrire une stratégie exprimant les exigences des revendications.

Le type de stratégie de revendication le plus simple recherche la présence d’une revendication et ne vérifie pas la valeur.

Générez et inscrivez la stratégie. Cela se produit dans le cadre de la configuration du service d’autorisation, qui participe normalement à ConfigureServices() dans votre fichier Startup.cs.

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

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

Dans ce cas, la stratégie EmployeeOnly vérifie la présence d’une revendication EmployeeNumber sur l’identité actuelle.

Vous appliquez ensuite la stratégie à l’aide de la propriété Policy sur l’attribut [Authorize] pour spécifier le nom de la stratégie ;

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

L’attribut [Authorize] peut être appliqué à un contrôleur entier, dans cette instance seules les identités correspondant à la stratégie seront autorisées à accéder à une action sur le contrôleur.

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

Si vous avez un contrôleur protégé par l’attribut, mais que vous souhaitez autoriser l’accès [Authorize] anonyme à des actions particulières, vous appliquez l’attribut AllowAnonymousAttribute.

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

    [AllowAnonymous]
    public ActionResult VacationPolicy()
    {
    }
}

La plupart des revendications sont fournies avec une valeur. Vous pouvez spécifier une liste de valeurs autorisées lors de la création de la stratégie. L’exemple suivant ne réussirait que pour les employés dont le nombre d’employés était 1, 2, 3, 4 ou 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"));
    });
}

Ajouter un contrôle générique de la demande

Si la valeur de revendication n’est pas une valeur unique ou si une transformation est requise, utilisez RequireAssertion. Pour plus d’informations, consultez Utiliser un func pour remplir une stratégie.

Évaluation de plusieurs stratégies

Si vous appliquez plusieurs stratégies à un contrôleur ou à une action, toutes les stratégies doivent passer avant que l’accès soit accordé. Par exemple :

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

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

Dans l’exemple ci-dessus, toute identité qui respecte la stratégie EmployeeOnly peut accéder à l’action Payslip car cette stratégie est appliquée au contrôleur. Toutefois, pour appeler l’action UpdateSalary, l’identité doit remplir à la fois la stratégie EmployeeOnly et la stratégie HumanResources.

Si vous souhaitez des stratégies plus complexes, telles que la prise d’une demande de date de naissance, le calcul d’un âge à partir de celle-ci, puis la vérification de l’âge de 21 ans ou plus, vous devez écrire des gestionnaires de stratégies personnalisés.