Autoryzacja oparta na rolach w programie ASP.NET Core

Po utworzeniu tożsamości 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 od wystawcy tożsamości 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 dotyczące tożsamości. 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 lubFinance 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 PowerUseri :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 lub PowerUser roli mogą uzyskiwać dostęp do kontrolera i SetTime akcji.
  • Tylko członkowie Administrator roli mogą uzyskiwać dostęp do ShutDown akcji.

Kontroler można zablokować, 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:

[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 Administratorról lub PowerUserBackupAdministrator .

Po utworzeniu tożsamości może należeć do co najmniej jednej roli. Na przykład Tracy może należeć do ról Administracja istratora i użytkownika, 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 lubFinance 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 lub PowerUser roli mogą uzyskiwać dostęp do kontrolera i SetTime akcji.
  • Tylko członkowie Administrator roli mogą uzyskiwać dostęp do ShutDown 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:

[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 Administratorról lub PowerUserBackupAdministrator .

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