Freigeben über


Anspruchsbasierte Autorisierung in ASP.NET Core

Wenn eine Identität erstellt wird, können ihr eine oder mehrere Berechtigungen zugewiesen werden, die von einer vertrauenswürdigen Partei ausgestellt wurden. Ein Claim ist ein Name-Wert-Paar, das den Subjekt repräsentiert, nicht die Fähigkeiten, die es ausführen kann. Beispielsweise können Sie über einen Führerschein verfügen, der von einer lokalen Führerscheinbehörde ausgestellt wurde. Ihr Führerschein enthält Ihr Geburtsdatum. In diesem Fall wäre der Anspruchsname DateOfBirth, der Anspruchswert wäre Ihr Geburtsdatum (z. B. 8th June 1970), und der Aussteller wäre die Führerscheinbehörde. Die anspruchsbasierte Autorisierung überprüft ganz grundsätzlich den Wert eines Anspruchs und erlaubt den Zugriff auf eine Ressource basierend auf diesem Wert. Wenn Sie beispielsweise einen Nachtclub besuchen möchten, kann der Autorisierungsprozess wie folgt aussehen:

Das Personal an der Tür bewertet die Gültigkeit Ihres Geburtsdatums und die Vertrauenswürdigkeit des Ausstellers (der Führerscheinbehörde), bevor Ihnen Zugang gewährt wird.

Eine Identität kann mehrere Ansprüche mit mehreren Werten enthalten und kann mehrere Ansprüche desselben Typs enthalten.

Hinzufügen von Anspruchsüberprüfungen

Anspruchsbasierte Autorisierungsüberprüfungen:

  • sind deklarativ.
  • werden auf Razor Seiten, Controller oder Aktionen innerhalb eines Controllers angewandt.
  • können nicht auf Ebene des Razor Seiten-Handlers angewandt werden, daher müssen sie auf die Seite angewandt werden.

Ansprüche im Code geben Ansprüche an, die aktuelle Benutzer*innen besitzen müssen, und optional den Wert, den der Anspruch für den Zugriff auf die angeforderte Ressource enthalten muss. Anspruchsanforderungen sind richtlinienbasiert. Entwickler*innen müssen eine Richtlinie erstellen und registrieren, die die Anspruchsanforderungen ausdrückt.

Der einfachste Typ einer Anspruchsrichtlinie sucht nach dem Vorhandensein eines Anspruchs, aber überprüft den Wert nicht.

Erstellen und registrieren Sie die Richtlinie, und rufen Sie UseAuthorization auf. Die Registrierung der Richtlinie erfolgt im Rahmen der Konfiguration des Autorisierungsdiensts, in der Regel in der Datei Program.cs:

var builder = WebApplication.CreateBuilder(args);

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

builder.Services.AddAuthorizationBuilder()
    .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();

In diesem Fall überprüft die EmployeeOnly-Richtlinie, ob für die aktuelle Identität ein EmployeeNumber-Anspruch vorhanden ist.

Sie wenden die Richtlinie mithilfe der Policy-Eigenschaft im [Authorize]-Attribut an, um den Richtliniennamen anzugeben.

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

Das [Authorize]-Attribut kann auf den gesamten Controller oder Razor Pages angewandt werden. In diesem Fall wird nur Identitäten, die der Richtlinie entsprechen, Zugriff auf eine Aktion auf dem Controller gewährt.

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

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

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

Der folgende Code wendet das [Authorize]-Attribut auf eine Razor-Seite an:

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

    }
}

Richtlinien können nicht auf Ebene der Razor Pages-Handler angewandt werden, sie müssen auf die Seite angewandt werden.

Wenn Sie über einen Controller verfügen, der durch das [Authorize]-Attribut geschützt ist, aber anonymen Zugriff auf bestimmte Aktionen zulassen möchten, wenden Sie das AllowAnonymousAttribute-Attribut an.

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

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

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

Da Richtlinien nicht auf Ebene der Razor-Seitenhandler angewandt werden können, wird empfohlen, einen Controller zu verwenden, wenn Richtlinien auf Seitenhandlerebene angewandt werden müssen. Der Rest der App, der keine Richtlinien auf der Razor-Seitenhandlerebene erfordert, kann Razor-Seiten verwenden.

Die meisten Ansprüche weisen einen Wert auf. Sie können beim Erstellen der Richtlinie eine Liste mit zulässigen Werten angeben. Das folgende Beispiel ist nur für Mitarbeiter*innen erfolgreich, deren Mitarbeiternummer 1, 2, 3, 4 oder 5 lautet.

var builder = WebApplication.CreateBuilder(args);

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

builder.Services.AddAuthorizationBuilder()
    .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();

Hinzufügen einer generischen Anspruchsüberprüfung

Wenn der Anspruchswert kein einzelner Wert ist oder wenn eine Transformation erforderlich ist, verwenden Sie RequireAssertion. Weitere Informationen finden Sie unter Verwenden einer Funktion zum Erfüllen einer Richtlinie.

Mehrfachbewertung von Richtlinien

Wenn mehrere Richtlinien auf Controller- und Aktionsebene angewandt werden, müssen alle Richtlinien erfüllt werden, bevor der Zugriff gewährt wird:

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

Im vorherigen Beispiel kann jede Identität, die die EmployeeOnly-Richtlinie erfüllt, auf die Payslip Aktion zugreifen, da diese Richtlinie auf dem Controller erzwungen wird. Um die UpdateSalary-Aktion aufzurufen, muss die Identität jedoch die -Richtlinie EmployeeOnly die HumanResources-Richtlinie erfüllen.

Wenn Sie komplexere Richtlinien benötigen, beispielsweise den Anspruch auf ein Geburtsdatum übernehmen, daraus ein Alter berechnen und dann überprüfen möchten, ob das Alter 21 oder höher ist, müssen Sie benutzerdefinierte Richtlinienhandler schreiben.

Im folgenden Beispiel müssen die beiden Seitenhandlermethoden sowohl die -Richtlinie als auch die HumanResources-Richtlinie erfüllen.

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

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

Wenn eine Identität erstellt wird, können ihr eine oder mehrere Berechtigungen zugewiesen werden, die von einer vertrauenswürdigen Partei ausgestellt wurden. Ein Claim ist ein Name-Wert-Paar, das das Subjekt repräsentiert, nicht das, was das Subjekt tun kann. Beispielsweise können Sie über einen Führerschein verfügen, der von einer lokalen Führerscheinbehörde ausgestellt wurde. Ihr Führerschein enthält Ihr Geburtsdatum. In diesem Fall wäre der Anspruchsname DateOfBirth, der Anspruchswert wäre Ihr Geburtsdatum (z. B. 8th June 1970), und der Aussteller wäre die Führerscheinbehörde. Die anspruchsbasierte Autorisierung überprüft ganz grundsätzlich den Wert eines Anspruchs und erlaubt den Zugriff auf eine Ressource basierend auf diesem Wert. Wenn Sie beispielsweise einen Nachtclub besuchen möchten, kann der Autorisierungsprozess wie folgt aussehen:

Das Personal an der Tür wertet den Wert Ihres Geburtsdatumsanspruchs und die Vertrauensstellung des Ausstellers (der Führerscheinbehörde) aus, bevor es Ihnen Zugang gewährt.

Eine Identität kann mehrere Ansprüche mit mehreren Werten enthalten und kann mehrere Ansprüche desselben Typs enthalten.

Hinzufügen von Anspruchsüberprüfungen

Anspruchsbasierte Autorisierungsüberprüfungen:

  • sind deklarativ.
  • Werden auf Razor Pages, Controller oder Aktionen innerhalb eines Controllers angewendet.
  • können nicht auf Ebene der Razor Seiten-Handler angewandt werden, sondern müssen auf die Seite selbst angewandt werden.

Ansprüche im Code geben Ansprüche an, die aktuelle Benutzer*innen besitzen müssen, und optional den Wert, den der Anspruch für den Zugriff auf die angeforderte Ressource enthalten muss. Anspruchsanforderungen sind richtlinienbasiert. Entwickler*innen müssen eine Richtlinie erstellen und registrieren, die die Anspruchsanforderungen ausdrückt.

Der einfachste Typ einer Anspruchsrichtlinie sucht nach dem Vorhandensein eines Anspruchs, aber überprüft den Wert nicht.

Erstellen und registrieren Sie die Richtlinie, und rufen Sie UseAuthorization auf. Die Registrierung der Richtlinie erfolgt im Rahmen der Konfiguration des Autorisierungsdiensts, in der Regel in der Datei 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();

In diesem Fall überprüft die EmployeeOnly-Richtlinie, ob für die aktuelle Identität ein EmployeeNumber-Anspruch vorhanden ist.

Sie wenden die Richtlinie mithilfe der Policy-Eigenschaft im [Authorize]-Attribut an, um den Richtliniennamen anzugeben.

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

Das [Authorize]-Attribut kann auf den gesamten Controller oder Razor Pages angewandt werden. In diesem Fall wird nur Identitäten, die der Richtlinie entsprechen, Zugriff auf eine Aktion auf dem Controller gewährt.

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

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

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

Der folgende Code wendet das [Authorize]-Attribut auf eine Razor-Seite an:

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

    }
}

Richtlinien können nicht auf Ebene der Razor Pages-Handler angewandt werden, sie müssen auf die Seite angewandt werden.

Wenn Sie über einen Controller verfügen, der durch das [Authorize]-Attribut geschützt ist, aber anonymen Zugriff auf bestimmte Aktionen zulassen möchten, wenden Sie das AllowAnonymousAttribute-Attribut an.

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

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

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

Da Richtlinien nicht auf Ebene der Razor-Seitenhandler angewandt werden können, wird empfohlen, einen Controller zu verwenden, wenn Richtlinien auf Seitenhandlerebene angewandt werden müssen. Der Rest der App, der keine Richtlinien auf der Razor-Seitenhandlerebene erfordert, kann Razor-Seiten verwenden.

Die meisten Ansprüche weisen einen Wert auf. Sie können beim Erstellen der Richtlinie eine Liste mit zulässigen Werten angeben. Das folgende Beispiel ist nur für Mitarbeiter*innen erfolgreich, deren Mitarbeiternummer 1, 2, 3, 4 oder 5 lautet.

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

Hinzufügen einer generischen Anspruchsüberprüfung

Wenn der Anspruchswert kein einzelner Wert ist oder wenn eine Transformation erforderlich ist, verwenden Sie RequireAssertion. Weitere Informationen finden Sie unter Verwenden einer Funktion zum Erfüllen einer Richtlinie.

Bewertung mehrerer Richtlinien

Wenn mehrere Richtlinien auf Controller- und Aktionsebene angewandt werden, müssen alle Richtlinien erfüllt werden, bevor der Zugriff gewährt wird:

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

Im vorherigen Beispiel kann jede Identität, die die EmployeeOnly-Richtlinie erfüllt, auf die Payslip Aktion zugreifen, da diese Richtlinie auf dem Controller erzwungen wird. Um die UpdateSalary-Aktion aufzurufen, muss die Identität jedoch die -Richtlinie EmployeeOnly die HumanResources-Richtlinie erfüllen.

Wenn Sie kompliziertere Richtlinien benötigen, wie zum Beispiel einen Geburtsdatum-Anspruch übernehmen, ein Alter daraus berechnen und dann überprüfen, ob das Alter 21 oder höher ist, müssen Sie benutzerdefinierte Richtlinien-Handler schreiben.

Im folgenden Beispiel müssen beide Seitenhandlermethoden sowohl die -Richtlinie als auch die HumanResources-Richtlinie erfüllen:

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

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

Wenn eine Identität erstellt wird, können ihr eine oder mehrere Berechtigungen zugewiesen werden, die von einer vertrauenswürdigen Partei ausgestellt wurden. Eine Anforderung ist ein Name-Wert-Paar, das darstellt, was das Subjekt ist, nicht welche Aufgaben das Subjekt ausführen kann. Beispielsweise können Sie über einen Führerschein verfügen, der von einer lokalen Führerscheinbehörde ausgestellt wurde. Ihr Führerschein enthält Ihr Geburtsdatum. In diesem Fall wäre der Anspruchsname DateOfBirth, der Anspruchswert wäre Ihr Geburtsdatum (z. B. 8th June 1970), und der Aussteller wäre die Führerscheinbehörde. Die anspruchsbasierte Autorisierung überprüft ganz grundsätzlich den Wert eines Anspruchs und erlaubt den Zugriff auf eine Ressource basierend auf diesem Wert. Wenn Sie beispielsweise einen Nachtclub besuchen möchten, kann der Autorisierungsprozess wie folgt aussehen:

Das Personal an der Tür wertet den Wert Ihres Geburtsdatumsanspruchs und die Vertrauensstellung des Ausstellers (der Führerscheinbehörde) aus, bevor es Ihnen Zugang gewährt.

Eine Identität kann mehrere Ansprüche mit mehreren Werten enthalten und kann mehrere Ansprüche desselben Typs enthalten.

Hinzufügen von Anspruchsüberprüfungen

Anspruchsbasierte Autorisierungsüberprüfungen sind deklarativ. Entwickler*innen betten sie in den Code für einen Controller oder eine Aktion innerhalb eines Controllers ein und geben Ansprüche an, die die aktuellen Benutzer*innen besitzen müssen. Optional können sie auch den Wert angeben, den der Anspruch für den Zugriff auf die angeforderte Ressource enthalten muss. Anspruchsanforderungen sind richtlinienbasiert. Entwickler*innen müssen eine Richtlinie erstellen und registrieren, die die Anspruchsanforderungen ausdrückt.

Der einfachste Typ einer Anspruchsrichtlinie sucht nach dem Vorhandensein eines Anspruchs, aber überprüft den Wert nicht.

Erstellen und registrieren Sie die Richtlinie. Dies erfolgt im Rahmen der Konfiguration des Autorisierungsdiensts, die normalerweise in ConfigureServices() in Ihrer Startup.cs Datei stattfindet.

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

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

Rufen Sie UseAuthorization in Configure auf. Der folgende Code wird von den ASP.NET Core-Web-App-Vorlagen generiert:

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

In diesem Fall überprüft die EmployeeOnly-Richtlinie, ob für die aktuelle Identität ein EmployeeNumber-Anspruch vorhanden ist.

Sie wenden die Richtlinie dann mithilfe der Policy-Eigenschaft im [Authorize]-Attribut an, um den Richtliniennamen anzugeben.

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

Das [Authorize]-Attribut kann auf den gesamten Controller angewandt werden. In diesem Fall wird nur den Identitäten, die der Richtlinie entsprechen, Zugriff auf eine Aktion auf dem Controller gewährt.

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

Wenn Sie über einen Controller verfügen, der durch das [Authorize]-Attribut geschützt ist, aber anonymen Zugriff auf bestimmte Aktionen zulassen möchten, wenden Sie das AllowAnonymousAttribute-Attribut an.

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

    [AllowAnonymous]
    public ActionResult VacationPolicy()
    {
    }
}

Die meisten Ansprüche weisen einen Wert auf. Sie können beim Erstellen der Richtlinie eine Liste mit zulässigen Werten angeben. Das folgende Beispiel ist nur für Mitarbeiter*innen erfolgreich, deren Mitarbeiternummer 1, 2, 3, 4 oder 5 lautet.

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

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

Hinzufügen einer generischen Anspruchsüberprüfung

Wenn der Anspruchswert kein einzelner Wert ist oder wenn eine Transformation erforderlich ist, verwenden Sie RequireAssertion. Weitere Informationen finden Sie unter Verwenden einer Funktion zum Erfüllen einer Richtlinie.

Bewertung mehrerer Richtlinien

Wenn Sie mehrere Richtlinien auf einen Controller oder eine Aktion anwenden, müssen alle Richtlinien erfüllt sein, damit Zugriff gewährt wird. Zum Beispiel:

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

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

Im obigen Beispiel kann jede Identität, die die EmployeeOnly-Richtlinie erfüllt, auf die Payslip Aktion zugreifen, da diese Richtlinie auf dem Controller erzwungen wird. Um die UpdateSalary-Aktion aufzurufen, muss die Identität jedoch sowohl die -Richtlinie als auch die EmployeeOnly-Richtlinie und die HumanResources-Richtlinie erfüllen.

Wenn Sie komplexere Richtlinien benötigen, z. B. die Übernahme eines Geburtsdatumsanspruchs, die Berechnung eines Alters daraus, und die Überprüfung, ob das Alter 21 oder höher ist, müssen Sie benutzerdefinierte Richtlinienhandler schreiben.

Wenn eine Identität erstellt wird, können ihr eine oder mehrere Berechtigungen zugewiesen werden, die von einer vertrauenswürdigen Partei ausgestellt wurden. Ein Claim ist ein Name-Wert-Paar, das das Subjekt repräsentiert, nicht aber die Eigenschaften oder Fähigkeiten, die es hat. Beispielsweise können Sie über einen Führerschein verfügen, der von einer lokalen Führerscheinbehörde ausgestellt wurde. Ihr Führerschein enthält Ihr Geburtsdatum. In diesem Fall wäre der Anspruchsname DateOfBirth, der Anspruchswert wäre Ihr Geburtsdatum (z. B. 8th June 1970), und der Aussteller wäre die Führerscheinbehörde. Die anspruchsbasierte Autorisierung überprüft ganz grundsätzlich den Wert eines Anspruchs und erlaubt den Zugriff auf eine Ressource basierend auf diesem Wert. Wenn Sie beispielsweise einen Nachtclub besuchen möchten, kann der Autorisierungsprozess wie folgt aussehen:

Türsicherheitsmitarbeiter bewerten den Anspruch auf Ihr Geburtsdatum und die Vertrauenswürdigkeit des Ausstellers (der Führerscheinbehörde), bevor sie Ihnen Zugang gewähren.

Eine Identität kann mehrere Ansprüche mit mehreren Werten enthalten und kann mehrere Ansprüche desselben Typs enthalten.

Hinzufügen von Anspruchsüberprüfungen

Anspruchsbasierte Autorisierungsüberprüfungen sind deklarativ. Entwickler*innen betten sie in den Code für einen Controller oder eine Aktion innerhalb eines Controllers ein und geben Ansprüche an, die die aktuellen Benutzer*innen besitzen müssen. Optional können sie auch den Wert angeben, den der Anspruch für den Zugriff auf die angeforderte Ressource enthalten muss. Anspruchsanforderungen sind richtlinienbasiert. Entwickler*innen müssen eine Richtlinie erstellen und registrieren, die die Anspruchsanforderungen ausdrückt.

Der einfachste Typ einer Anspruchsrichtlinie sucht nach dem Vorhandensein eines Anspruchs, aber überprüft den Wert nicht.

Erstellen und registrieren Sie die Richtlinie. Dies erfolgt im Rahmen der Konfiguration des Autorisierungsdiensts, die normalerweise in ConfigureServices() Ihrer Datei Startup.cs enthalten ist.

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

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

In diesem Fall überprüft die EmployeeOnly-Richtlinie, ob für die aktuelle Identität ein EmployeeNumber-Anspruch vorhanden ist.

Sie wenden die Richtlinie dann mithilfe der Policy-Eigenschaft im [Authorize]-Attribut an, um den Richtliniennamen anzugeben.

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

Das [Authorize]-Attribut kann auf den gesamten Controller angewandt werden. In diesem Fall wird nur den Identitäten, die der Richtlinie entsprechen, Zugriff auf eine Aktion auf dem Controller gewährt.

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

Wenn Sie über einen Controller verfügen, der durch das [Authorize]-Attribut geschützt ist, aber anonymen Zugriff auf bestimmte Aktionen zulassen möchten, wenden Sie das AllowAnonymousAttribute-Attribut an.

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

    [AllowAnonymous]
    public ActionResult VacationPolicy()
    {
    }
}

Die meisten Ansprüche weisen einen Wert auf. Sie können beim Erstellen der Richtlinie eine Liste mit zulässigen Werten angeben. Das folgende Beispiel ist nur für Mitarbeiter*innen erfolgreich, deren Mitarbeiternummer 1, 2, 3, 4 oder 5 lautet.

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

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

Hinzufügen einer generischen Anspruchsüberprüfung

Wenn der Anspruchswert kein einzelner Wert ist oder wenn eine Transformation erforderlich ist, verwenden Sie RequireAssertion. Weitere Informationen finden Sie unter Verwenden einer Funktion zum Erfüllen einer Richtlinie.

Bewertung mehrerer Policies

Wenn Sie mehrere Richtlinien auf einen Controller oder eine Aktion anwenden, müssen alle Richtlinien erfüllt sein, damit Zugriff gewährt wird. Zum Beispiel:

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

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

Im obigen Beispiel kann jede Identität, die die EmployeeOnly-Richtlinie erfüllt, auf die Payslip Aktion zugreifen, da diese Richtlinie auf dem Controller erzwungen wird. Um die UpdateSalary-Aktion aufzurufen, muss die Identität jedoch sowohl die EmployeeOnly-Richtlinie als auch die HumanResources-Richtlinie erfüllen.

Wenn Sie komplexere Richtlinien benötigen, z. B. die Übernahme eines Geburtsdatumsanspruchs, die Berechnung eines Alters daraus, und die Überprüfung, ob das Alter 21 oder höher ist, müssen Sie benutzerdefinierte Richtlinienhandler schreiben.

Empfindlichkeit der Groß-/Kleinschreibung in Anspruch

Claim-Werte werden mithilfe von StringComparison.Ordinal verglichen. Dies bedeutet , dass Admin (Großbuchstaben A) und admin (Kleinbuchstaben a) immer als unterschiedliche Rollen behandelt werden, unabhängig davon, welcher Authentifizierungshandler die Identität erstellt hat.

Unabhängig davon kann der Anspruchstypvergleich (der verwendet wird, um Rollenansprüche nach ihrem Anspruchstyp zu finden, wie http://schemas.microsoft.com/ws/2008/06/identity/claims/role) entweder gross-/kleinsensitiv oder nicht sensitiv sein, abhängig von der ClaimsIdentity Implementierung. Mit Microsoft.IdentityModel in ASP.NET Core 8.0 oder höher (verwendet von AddJwtBearer, AddOpenIdConnect, AddWsFederation, und AddMicrosoftIdentityWebApp/AddMicrosoftIdentityWebApi), wird CaseSensitiveClaimsIdentity während der Tokenvalidierung erstellt, die eine groß-/kleinschreibungssensitive Übereinstimmung von Anspruchstypen verwendet.

Die von der .NET-Runtime bereitgestellte Standardeinstellung ClaimsIdentity (in den meisten Fällen verwendet, einschließlich aller cookie-basierten Flüsse) verwendet weiterhin den Abgleich von Anspruchstypen, der unabhängig von der Groß- und Kleinschreibung ist.

In der Praxis ist diese Unterscheidung selten für die Rollenautorisierung wichtig, da der Rollenanspruchstyp einmal während der Identitätserstellung festgelegt und konsistent abgeglichen wird. Verwenden Sie immer einheitliche Groß-/Kleinschreibung für Rollennamen und Anspruchstypen, um subtile Probleme zu vermeiden.