Autoryzacja oparta na rolach w programie ASP.NET Core
Po utworzeniu elementu identity może należeć do co najmniej jednej roli. Na przykład Tracy może należeć do Administrator
ról i User
, podczas gdy Scott może należeć tylko do User
roli. Sposób tworzenia i zarządzania tymi rolami zależy od magazynu zapasowego procesu autoryzacji. Role są udostępniane deweloperowi za pomocą IsInRole metody w ClaimsPrincipal klasie . AddRoles należy dodać do usług ról.
Chociaż role są oświadczeniami, nie wszystkie oświadczenia są rolami. W zależności identity od wystawcy rola może być kolekcją użytkowników, którzy mogą stosować oświadczenia dla członków grupy, a także rzeczywiste oświadczenie w obiekcie identity. Oświadczenia mają jednak być informacjami o indywidualnym użytkowniku. Używanie ról do dodawania oświadczeń do użytkownika może mylić granicę między użytkownikiem a ich indywidualnymi oświadczeniami. To zamieszanie polega na tym, że szablony SPA nie są projektowane wokół ról. Ponadto w przypadku organizacji migrujących ze starszego systemu lokalnego rozprzestrzenianie się ról na przestrzeni lat może oznaczać, że oświadczenie roli może być zbyt duże, aby znajdowało się w tokenie używanym przez spAs. Aby zabezpieczyć elementy SPA, zobacz Zabezpieczanie Identity zaplecza internetowego interfejsu API dla spAs.
Dodawanie usług ról do Identity
Zarejestruj usługi autoryzacji opartej na rolach w programie Program.cs
, wywołując AddRoles element z typem roli w konfiguracji aplikacji Identity . Typ roli w poniższym przykładzie to IdentityRole
:
builder.Services.AddDefaultIdentity<IdentityUser>( ... )
.AddRoles<IdentityRole>()
...
Powyższy kod wymaga elementu Microsoft.AspNetCore.Identity. Pakiet interfejsu using
użytkownika i dyrektywa dla elementu Microsoft.AspNetCore.Identity
.
Dodawanie kontroli ról
Kontrole autoryzacji opartej na rolach:
- Są deklaratywne i określają role, których bieżący użytkownik musi być członkiem, aby uzyskać dostęp do żądanego zasobu.
- Są stosowane do Razor stron, kontrolerów lub akcji w obrębie kontrolera.
- Nie można zastosować ich na Razor poziomie obsługi strony. Należy je zastosować do strony.
Na przykład poniższy kod ogranicza dostęp do jakichkolwiek akcji AdministrationController
dla użytkowników, którzy są członkami Administrator
roli:
[Authorize(Roles = "Administrator")]
public class AdministrationController : Controller
{
public IActionResult Index() =>
Content("Administrator");
}
Wiele ról można określić jako listę rozdzielaną przecinkami:
[Authorize(Roles = "HRManager,Finance")]
public class SalaryController : Controller
{
public IActionResult Payslip() =>
Content("HRManager || Finance");
}
Element SalaryController
jest dostępny tylko dla użytkowników, którzy są członkami HRManager
roli lub Finance
roli.
Po zastosowaniu wielu atrybutów użytkownik dostępu musi być członkiem wszystkich określonych ról. Poniższy przykład wymaga, aby użytkownik był członkiem roli PowerUser
i : ControlPanelUser
[Authorize(Roles = "PowerUser")]
[Authorize(Roles = "ControlPanelUser")]
public class ControlPanelController : Controller
{
public IActionResult Index() =>
Content("PowerUser && ControlPanelUser");
}
Dostęp do akcji można ograniczyć, stosując dodatkowe atrybuty autoryzacji roli na poziomie akcji:
[Authorize(Roles = "Administrator, PowerUser")]
public class ControlAllPanelController : Controller
{
public IActionResult SetTime() =>
Content("Administrator || PowerUser");
[Authorize(Roles = "Administrator")]
public IActionResult ShutDown() =>
Content("Administrator only");
}
W poprzednim kontrolerze ControlAllPanelController
:
Administrator
Członkowie roli lubPowerUser
roli mogą uzyskiwać dostęp do kontrolera iSetTime
akcji.- Tylko członkowie
Administrator
roli mogą uzyskiwać dostęp doShutDown
akcji.
Kontroler można zabezpieczyć, ale zezwalać na anonimowy, nieuwierzytelniony dostęp do poszczególnych akcji:
[Authorize]
public class Control3PanelController : Controller
{
public IActionResult SetTime() =>
Content("[Authorize]");
[AllowAnonymous]
public IActionResult Login() =>
Content("[AllowAnonymous]");
}
W przypadku Razor stron [Authorize]
można zastosować jedną z następujących metod:
- Używanie konwencji lub
- Zastosowanie elementu
[Authorize]
PageModel
do wystąpienia:
[Authorize(Policy = "RequireAdministratorRole")]
public class UpdateModel : PageModel
{
public IActionResult OnPost() =>
Content("OnPost RequireAdministratorRole");
}
Ważne
Atrybuty filtru, w tym AuthorizeAttribute
, można stosować tylko do modelu PageModel i nie można ich zastosować do określonych metod obsługi stron.
Sprawdzanie ról opartych na zasadach
Wymagania dotyczące roli można również wyrazić przy użyciu składni zasad, w której deweloper rejestruje zasady podczas uruchamiania aplikacji w ramach konfiguracji usługi autoryzacji. Zwykle występuje to w Program.cs
pliku:
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();
Zasady są stosowane przy użyciu Policy właściwości atrybutu [Authorize]
:
[Authorize(Policy = "RequireAdministratorRole")]
public IActionResult Shutdown()
{
return View();
}
Aby określić wiele dozwolonych ról w wymaganiu, określ 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();
Powyższy kod autoryzuje użytkowników należących do Administrator
ról lub PowerUser
BackupAdministrator
.
Po utworzeniu elementu identity może należeć do co najmniej jednej roli. Na przykład Tracy może należeć do ról Administrator i Użytkownik, podczas gdy Scott może należeć tylko do roli Użytkownik. Sposób tworzenia i zarządzania tymi rolami zależy od magazynu zapasowego procesu autoryzacji. Role są udostępniane deweloperowi za pomocą IsInRole metody w ClaimsPrincipal klasie .
Nie zalecamy używania ról jako oświadczeń, ale zamiast używania oświadczeń. W przypadku korzystania z aplikacji jednostronicowych (SPA) zobacz Zabezpieczanie Identity zaplecza internetowego interfejsu API dla spA.
Dodawanie kontroli ról
Kontrole autoryzacji opartej na rolach:
- Są deklaratywne.
- Są stosowane do Razor stron, kontrolerów lub akcji w obrębie kontrolera.
- Nie można zastosować ich na Razor poziomie obsługi strony. Należy je zastosować do strony.
Sprawdzanie autoryzacji opartej na rolach określa, które role bieżący użytkownik musi być członkiem, aby uzyskać dostęp do żądanego zasobu.
Na przykład poniższy kod ogranicza dostęp do jakichkolwiek akcji AdministrationController
dla użytkowników, którzy są członkami Administrator
roli:
[Authorize(Roles = "Administrator")]
public class AdministrationController : Controller
{
public IActionResult Index() =>
Content("Administrator");
}
Wiele ról można określić jako listę rozdzielaną przecinkami:
[Authorize(Roles = "HRManager,Finance")]
public class SalaryController : Controller
{
public IActionResult Payslip() =>
Content("HRManager || Finance");
}
Kontroler SalaryController
jest dostępny tylko dla użytkowników, którzy są członkami HRManager
roli lub Finance
roli.
W przypadku zastosowania wielu atrybutów użytkownik dostępu musi być członkiem wszystkich określonych ról. Poniższy przykład wymaga, aby użytkownik był członkiem roli PowerUser
i :ControlPanelUser
[Authorize(Roles = "PowerUser")]
[Authorize(Roles = "ControlPanelUser")]
public class ControlPanelController : Controller
{
public IActionResult Index() =>
Content("PowerUser && ControlPanelUser");
}
Możesz jeszcze bardziej ograniczyć dostęp, stosując dodatkowe atrybuty autoryzacji roli na poziomie akcji:
[Authorize(Roles = "Administrator, PowerUser")]
public class ControlAllPanelController : Controller
{
public IActionResult SetTime() =>
Content("Administrator || PowerUser");
[Authorize(Roles = "Administrator")]
public IActionResult ShutDown() =>
Content("Administrator only");
}
Jeśli na poziomie kontrolera i akcji zastosowano wiele atrybutów, wszystkie atrybuty muszą zostać przekazane przed udzieleniem dostępu:
[Authorize(Roles = "Administrator")]
public class ControlAllPanelController2 : Controller
{
public IActionResult SetTime() =>
Content("Administrator only");
[Authorize(Roles = "PowerUser")]
public IActionResult ShutDown() =>
Content("Administrator && PowerUser");
}
W poprzednim kontrolerze ControlAllPanelController
:
Administrator
Członkowie roli lubPowerUser
roli mogą uzyskiwać dostęp do kontrolera iSetTime
akcji.- Tylko członkowie
Administrator
roli mogą uzyskiwać dostęp doShutDown
akcji.
Możesz również zablokować kontroler, ale zezwolić na anonimowy, nieuwierzytelniony dostęp do poszczególnych akcji.
[Authorize]
public class Control3PanelController : Controller
{
public IActionResult SetTime() =>
Content("[Authorize]");
[AllowAnonymous]
public IActionResult Login() =>
Content("[AllowAnonymous]");
}
W przypadku Razor stron [Authorize]
można zastosować jedną z następujących opcji:
- Używanie konwencji lub
- Zastosowanie elementu
[Authorize]
PageModel
do wystąpienia:
[Authorize(Policy = "RequireAdministratorRole")]
public class UpdateModel : PageModel
{
public ActionResult OnPost()
{
}
}
Ważne
Atrybuty filtru, w tym AuthorizeAttribute
, można stosować tylko do modelu PageModel i nie można ich zastosować do określonych metod obsługi stron.
Sprawdzanie ról opartych na zasadach
Wymagania dotyczące roli można również wyrazić przy użyciu nowej składni zasad, w której deweloper rejestruje zasady podczas uruchamiania w ramach konfiguracji usługi autoryzacji. Zwykle występuje to w ConfigureServices()
Startup.cs
pliku.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddRazorPages();
services.AddAuthorization(options =>
{
options.AddPolicy("RequireAdministratorRole",
policy => policy.RequireRole("Administrator"));
});
}
Zasady są stosowane przy użyciu Policy
właściwości atrybutu [Authorize]
:
[Authorize(Policy = "RequireAdministratorRole")]
public IActionResult Shutdown()
{
return View();
}
Jeśli chcesz określić wiele dozwolonych ról w wymaganiu, możesz określić je jako parametry RequireRole
metody:
options.AddPolicy("ElevatedRights", policy =>
policy.RequireRole("Administrator", "PowerUser", "BackupAdministrator"));
W tym przykładzie autoryzuje użytkowników, którzy należą do Administrator
ról lub PowerUser
BackupAdministrator
.
Dodawanie usług ról do Identity
Dołącz AddRoles , aby dodać usługi ról:
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();
}