Autorizace na základě rolí v ASP.NET Core
Když je vytvořen identity , 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 vydavateli identity může být role kolekce uživatelů, kteří mohou uplatňovat deklarace identity pro členy skupiny, stejně jako skutečné deklarace identity na straně 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 nebo Finance
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 PowerUser
role i ControlPanelUser
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 neboPowerUser
role mají přístup ke kontroleru aSetTime
akci.- K akci mají přístup
ShutDown
jenom členovéAdministrator
role.
Kontroler je možné zabezpečit, 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í:
- Použití konvence nebo
- Použití instance
[Authorize]
PageModel
:
[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 Administrator
nebo PowerUser
BackupAdministrator
rolí.
Když je vytvořen identity , může patřit do jedné nebo více rolí. Například Tracy může patřit do role správce a 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 nebo Finance
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 neboPowerUser
role mají přístup ke kontroleru aSetTime
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í:
- Použití konvence nebo
- Použití instance
[Authorize]
PageModel
:
[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();
}