Autorizace na základě rolí v ASP.NET Core

Když je identita vytvořena, může patřit do jedné nebo více rolí. Například Tracy může patřit do Administrator rolí, User zatímco Scott může patřit pouze k User roli. Způsob vytváření a správa těchto rolí závisí na záložním úložišti procesu autorizace. Role jsou zpřístupněny vývojáři prostřednictvím IsInRole metody ve ClaimsPrincipal třídě. AddRoles musí být přidán do služeb rolí.

Zatímco role jsou deklarace identity, ne všechny deklarace identity jsou role. V závislosti na vystavitele identity může být role kolekce uživatelů, kteří můžou uplatňovat deklarace identity pro členy skupiny a také skutečnou deklaraci identity. Deklarace identity ale mají být informace o jednotlivých uživatelech. Použití rolí k přidání deklarací identity uživateli může zmást hranice mezi uživatelem a jejich jednotlivými deklaracemi. To je důvod, proč šablony SPA nejsou navrženy pro role. Kromě toho může u organizací, které migrují z místního staršího systému, rozšíření rolí v průběhu let znamenat, že deklarace role může být příliš velká, aby byla obsažena v tokenu použitelném službami SPA. Pokud chcete zabezpečit služby SPA, přečtěte si téma Použití Identity k zabezpečení back-endu webového rozhraní API pro služby SPA.

Přidání služeb rolí do Identity

Registrace autorizačních služeb Program.cs založených na rolích voláním AddRoles typu role v konfiguraci aplikace Identity Typ role v následujícím příkladu je IdentityRole:

builder.Services.AddDefaultIdentity<IdentityUser>( ... )
    .AddRoles<IdentityRole>()
    ...

Předchozí kód vyžaduje Microsoft.AspNetCore.Identity. Balíček uživatelského rozhraní a direktiva using pro Microsoft.AspNetCore.Identity.

Přidání kontrol rolí

Kontroly autorizace na základě rolí:

  • Jsou deklarativní a určují role, které musí být aktuální uživatel členem pro přístup k požadovanému prostředku.
  • Použijí se na Razor stránky, kontrolery nebo akce v rámci kontroleru.
  • Nelze použít na Razor úrovni obslužné rutiny stránky, musí být použity na stránku.

Následující kód například omezuje přístup k jakýmkoli akcím na AdministrationController uživatele, kteří jsou členem Administrator této role:

[Authorize(Roles = "Administrator")]
public class AdministrationController : Controller
{
    public IActionResult Index() =>
        Content("Administrator");
}

Více rolí je možné zadat jako seznam oddělený čárkami:

[Authorize(Roles = "HRManager,Finance")]
public class SalaryController : Controller
{
    public IActionResult Payslip() =>
                    Content("HRManager || Finance");
}

Přístupná SalaryController je pouze uživatelům, kteří jsou členy HRManager role neboFinance role.

Při použití více atributů musí být přístupový uživatel členem všech zadaných rolí. Následující ukázka vyžaduje, aby uživatel byl členem PowerUserrole iControlPanelUser role:

[Authorize(Roles = "PowerUser")]
[Authorize(Roles = "ControlPanelUser")]
public class ControlPanelController : Controller
{
    public IActionResult Index() =>
        Content("PowerUser && ControlPanelUser");
}

Přístup k akci může být omezen použitím dalších atributů autorizace role na úrovni akce:

[Authorize(Roles = "Administrator, PowerUser")]
public class ControlAllPanelController : Controller
{
    public IActionResult SetTime() =>
        Content("Administrator || PowerUser");

    [Authorize(Roles = "Administrator")]
    public IActionResult ShutDown() =>
        Content("Administrator only");
}

V předchozím ControlAllPanelController kontroleru:

  • Administrator Členové role nebo PowerUser role mají přístup ke kontroleru a SetTime akci.
  • K akci mají přístup ShutDown jenom členové Administrator role.

Kontroler je možné uzamknout, ale povolit anonymní a neověřený přístup k jednotlivým akcím:

[Authorize]
public class Control3PanelController : Controller
{
    public IActionResult SetTime() =>
        Content("[Authorize]");

    [AllowAnonymous]
    public IActionResult Login() =>
        Content("[AllowAnonymous]");
}

U Razor stránek [Authorize] je možné použít některou z těchto akcí:

[Authorize(Policy = "RequireAdministratorRole")]
public class UpdateModel : PageModel
{
    public IActionResult OnPost() =>
         Content("OnPost RequireAdministratorRole");
}

Důležité

Atributy filtru, včetně AuthorizeAttribute, lze použít pouze na PageModel a nelze je použít pro konkrétní metody obslužné rutiny stránky.

Kontroly rolí na základě zásad

Požadavky na roli se dají vyjádřit také pomocí syntaxe zásad, kdy vývojář zaregistruje zásadu při spuštění aplikace jako součást konfigurace autorizační služby. K tomu obvykle dochází v Program.cs souboru:

var builder = WebApplication.CreateBuilder(args);

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

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

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

Zásady se použijí pomocí Policy vlastnosti atributu [Authorize] :

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

Pokud chcete v požadavku zadat více povolených rolí, zadejte je jako parametry RequireRole metody:

var builder = WebApplication.CreateBuilder(args);

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

builder.Services.AddAuthorization(options =>
{
    options.AddPolicy("ElevatedRights", policy =>
          policy.RequireRole("Administrator", "PowerUser", "BackupAdministrator"));
});

var app = builder.Build();

Předchozí kód autorizuje uživatele, kteří patří do Administratornebo PowerUserBackupAdministrator rolí.

Když je identita vytvořena, může patřit do jedné nebo více rolí. Například Tracy může patřit do Správa istrator a role uživatele, zatímco Scott může patřit pouze do role Uživatele. Způsob vytváření a správa těchto rolí závisí na záložním úložišti procesu autorizace. Role jsou zpřístupněny vývojáři prostřednictvím IsInRole metody ve ClaimsPrincipal třídě.

Jako deklarace identity doporučujeme nepoužít role, ale místo toho použít deklarace identity. Pokud používáte jednostrákové aplikace (SPA), přečtěte si téma Použití Identity k zabezpečení back-endu webového rozhraní API pro služby SPA.

Přidání kontrol rolí

Kontroly autorizace na základě rolí:

  • Jsou deklarativní.
  • Použijí se na Razor stránky, kontrolery nebo akce v rámci kontroleru.
  • Nelze použít na Razor úrovni obslužné rutiny stránky, musí být použity na stránku.

Kontroly autorizace na základě role určují, které role musí být aktuálním uživatelem členem pro přístup k požadovanému prostředku.

Následující kód například omezuje přístup k jakýmkoli akcím na AdministrationController uživatele, kteří jsou členem Administrator této role:

[Authorize(Roles = "Administrator")]
public class AdministrationController : Controller
{
    public IActionResult Index() =>
        Content("Administrator");
}

Více rolí je možné zadat jako seznam oddělený čárkami:

[Authorize(Roles = "HRManager,Finance")]
public class SalaryController : Controller
{
    public IActionResult Payslip() =>
                    Content("HRManager || Finance");
}

Kontroler SalaryController je přístupný jenom uživatelům, kteří jsou členy HRManager role neboFinance role.

Pokud použijete více atributů, musí být přístupový uživatel členem všech zadaných rolí. Následující ukázka vyžaduje, aby uživatel byl členem PowerUser role i ControlPanelUser role:

[Authorize(Roles = "PowerUser")]
[Authorize(Roles = "ControlPanelUser")]
public class ControlPanelController : Controller
{
    public IActionResult Index() =>
        Content("PowerUser && ControlPanelUser");
}

Přístup můžete dále omezit použitím dalších atributů autorizace rolí na úrovni akce:

[Authorize(Roles = "Administrator, PowerUser")]
public class ControlAllPanelController : Controller
{
    public IActionResult SetTime() =>
        Content("Administrator || PowerUser");

    [Authorize(Roles = "Administrator")]
    public IActionResult ShutDown() =>
        Content("Administrator only");
}

Pokud se na úrovni kontroleru a akce použije více atributů, musí se před udělením přístupu předat všechny atributy:

[Authorize(Roles = "Administrator")]
public class ControlAllPanelController2 : Controller
{
    public IActionResult SetTime() =>
        Content("Administrator only");

    [Authorize(Roles = "PowerUser")]
    public IActionResult ShutDown() =>
        Content("Administrator && PowerUser");
}

V předchozím ControlAllPanelController kontroleru:

  • Administrator Členové role nebo PowerUser role mají přístup ke kontroleru a SetTime akci.
  • K akci mají přístup ShutDown jenom členové Administrator role.

Kontroler můžete také uzamknout, ale povolit anonymní a neověřený přístup k jednotlivým akcím.

[Authorize]
public class Control3PanelController : Controller
{
    public IActionResult SetTime() =>
        Content("[Authorize]");

    [AllowAnonymous]
    public IActionResult Login() =>
        Content("[AllowAnonymous]");
}

U Razor stránek je možné použít [Authorize] některou z těchto akcí:

[Authorize(Policy = "RequireAdministratorRole")]
public class UpdateModel : PageModel
{
    public ActionResult OnPost()
    {
    }
}

Důležité

Atributy filtru, včetně AuthorizeAttribute, lze použít pouze na PageModel a nelze je použít pro konkrétní metody obslužné rutiny stránky.

Kontroly rolí na základě zásad

Požadavky na roli je možné vyjádřit také pomocí nové syntaxe zásad, kdy vývojář zaregistruje zásadu při spuštění jako součást konfigurace autorizační služby. K tomu obvykle dochází ve ConfigureServices() vašem Startup.cs souboru.

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

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

Zásady se použijí pomocí Policy vlastnosti atributu [Authorize]:

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

Pokud chcete v požadavku zadat více povolených rolí, můžete je zadat jako parametry metody RequireRole :

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

Tento příklad autorizuje uživatele, kteří patří do Administrator, PowerUser nebo BackupAdministrator rolí.

Přidání služeb rolí do Identity

Připojení AddRoles k přidání služeb rolí:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));
    services.AddDefaultIdentity<IdentityUser>()
        .AddRoles<IdentityRole>()
        .AddEntityFrameworkStores<ApplicationDbContext>();

    services.AddControllersWithViews();
    services.AddRazorPages();
}