Ověřování na základě rolí v ASP.NET Core
Při vytvoření identity může patřit k jedné nebo více rolím. Tracy může například patřit rolím Správce a uživatele, zatímco Scott může patřit pouze do role uživatele. Způsob vytváření a správy těchto rolí závisí na záložním úložišti procesu autorizace. Role jsou k dispozici vývojářům prostřednictvím metody IsInRole třídy ClaimsPrincipal .
Přidávání kontrol rolí
Kontroly autorizace na základě rolí jsou deklarativní, když je — vývojář vloží do svého kódu, proti kontroleru nebo akci v rámci kontroleru, přičemž určení rolí, které musí být aktuálním uživatelem členem, aby bylo možné získat přístup k požadovanému prostředku.
Například následující kód omezuje přístup k jakýmkoli akcím na AdministrationController uživatele, kteří jsou členy této Administrator role:
[Authorize(Roles = "Administrator")]
public class AdministrationController : Controller
{
}
Jako seznam oddělený čárkami můžete zadat více rolí:
[Authorize(Roles = "HRManager,Finance")]
public class SalaryController : Controller
{
}
Tento kontroler by měl být přístupný jenom uživatelům, kteří jsou členy HRManager role nebo Finance role.
Pokud použijete více atributů, musí být přistupující uživatel členem všech zadaných rolí. Následující ukázka vyžaduje, aby uživatel byl členem PowerUser ControlPanelUser role i.
[Authorize(Roles = "PowerUser")]
[Authorize(Roles = "ControlPanelUser")]
public class ControlPanelController : Controller
{
}
Přístup můžete dále omezit použitím atributů autorizace další role na úrovni akce:
[Authorize(Roles = "Administrator, PowerUser")]
public class ControlPanelController : Controller
{
public ActionResult SetTime()
{
}
[Authorize(Roles = "Administrator")]
public ActionResult ShutDown()
{
}
}
V předchozím fragmentu kódu, který je členem Administrator role nebo PowerUser role, má přístup k řadiči a SetTime akci, ale Administrator k této akci mají přístup jenom členové této role ShutDown .
Můžete také Uzamknout kontroler, ale povolit anonymní a neověřený přístup k jednotlivým akcím.
[Authorize]
public class ControlPanelController : Controller
{
public ActionResult SetTime()
{
}
[AllowAnonymous]
public ActionResult Login()
{
}
}
Pro Razor stránky AuthorizeAttribute lze použít buď:
- Pomocí konvencenebo
- Aplikuje se na
AuthorizeAttributePageModelinstanci:
[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 na konkrétní metody obslužné rutiny stránky.
Kontroly rolí na základě zásad
Požadavky role lze také vyjádřit pomocí nové syntaxe zásad, kde vývojář při spuštění zaregistruje zásadu při spuštění jako součást konfigurace autorizační služby. K tomu obvykle dochází v ConfigureServices() souboru Startup. cs .
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddRazorPages();
services.AddAuthorization(options =>
{
options.AddPolicy("RequireAdministratorRole",
policy => policy.RequireRole("Administrator"));
});
}
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddAuthorization(options =>
{
options.AddPolicy("RequireAdministratorRole",
policy => policy.RequireRole("Administrator"));
});
}
Zásady se aplikují pomocí Policy vlastnosti u AuthorizeAttribute atributu:
[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 RequireRole metody:
options.AddPolicy("ElevatedRights", policy =>
policy.RequireRole("Administrator", "PowerUser", "BackupAdministrator"));
Tento příklad autorizuje uživatele, kteří patří do Administrator PowerUser rolí nebo BackupAdministrator .
Přidat služby rolí do Identity
Připojit Přidat role pro přidání služeb role:
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();
}
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddDefaultIdentity<IdentityUser>()
.AddRoles<IdentityRole>()
.AddDefaultUI(UIFramework.Bootstrap4)
.AddEntityFrameworkStores<ApplicationDbContext>();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}