Rollbaserad auktorisering i ASP.NET Core
När en identity skapas kan den tillhöra en eller flera roller. Tracy kan till exempel tillhöra rollerna Administrator
och User
medan Scott bara tillhör User
rollen. Hur dessa roller skapas och hanteras beror på lagringsplatsen för auktoriseringsprocessen. Roller exponeras för utvecklaren via metoden IsInRole i klassen ClaimsPrincipal.
AddRoles måste läggas till i Rolltjänster.
Även om roller är anspråk är inte alla anspråk roller. Beroende på identity utfärdare kan en roll vara en samling användare som kan tillämpa anspråk för gruppmedlemmar, samt ett faktiskt anspråk på en identity. Anspråk är dock avsedda att vara information om en enskild användare. Att använda roller för att lägga till anspråk till en användare kan förvirra gränsen mellan användaren och deras enskilda anspråk. Den här förvirringen är anledningen till att SPA-mallarna inte är utformade för roller. För organisationer som migrerar från ett lokalt äldre system kan dessutom spridningen av roller genom åren innebära att ett rollanspråk kan vara för stort för att ingå i en token som kan användas av SPA:er. För att skydda SPA:er, se Använd Identity för att skydda en webb-API-serverdel för SPA:er.
Den här artikeln beskriver rollbaserad auktorisering för ASP.NET Core MVC och Razor appar. För Blazor appar, se ASP.NET Core Blazor-autentisering och auktorisering och ASP.NET Core Blazor WebAssembly med Microsoft Entra ID-grupper och roller.
Lägga till rolltjänster i Identity
Registrera rollbaserade auktoriseringstjänster i Program.cs
genom att anropa AddRoles med rolltypen i appens Identity konfiguration. Rolltypen i följande exempel är IdentityRole
:
builder.Services.AddDefaultIdentity<IdentityUser>( ... )
.AddRoles<IdentityRole>()
...
Föregående kod kräver Microsoft.AspNetCore.Identity. UI paket och ett using
direktiv för Microsoft.AspNetCore.Identity
.
Lägga till rollkontroller
Rollbaserade auktoriseringskontroller:
- Är deklarativa och anger roller som den aktuella användaren måste vara medlem i för att få åtkomst till den begärda resursen.
- Tillämpas på Razor sidor, kontroller eller åtgärder i en kontroll.
- Kan inte tillämpas på Razor sidhanterarnivå måste de tillämpas på sidan.
Följande kod begränsar till exempel åtkomsten till alla åtgärder på AdministrationController
till användare som är medlemmar i Administrator
-rollen:
[Authorize(Roles = "Administrator")]
public class AdministrationController : Controller
{
public IActionResult Index() =>
Content("Administrator");
}
Flera roller kan anges som en kommaavgränsad lista:
[Authorize(Roles = "HRManager,Finance")]
public class SalaryController : Controller
{
public IActionResult Payslip() =>
Content("HRManager || Finance");
}
SalaryController
är endast tillgänglig för användare som är medlemmar i rollen HRManager
eller rollen Finance
.
När flera attribut tillämpas måste en användare som kommer åt vara medlem i alla de angivna rollerna. Följande exempel kräver att en användare är medlem i både och, samt i PowerUser
ochControlPanelUser
:
[Authorize(Roles = "PowerUser")]
[Authorize(Roles = "ControlPanelUser")]
public class ControlPanelController : Controller
{
public IActionResult Index() =>
Content("PowerUser && ControlPanelUser");
}
Åtkomst till en åtgärd kan begränsas genom att ytterligare attribut för rollauktorisering tillämpas på åtgärdsnivå:
[Authorize(Roles = "Administrator, PowerUser")]
public class ControlAllPanelController : Controller
{
public IActionResult SetTime() =>
Content("Administrator || PowerUser");
[Authorize(Roles = "Administrator")]
public IActionResult ShutDown() =>
Content("Administrator only");
}
I den föregående ControlAllPanelController
styrenheten:
- Medlemmar i rollen
Administrator
ellerPowerUser
kan komma åt kontrollanten och åtgärdenShutDown
. - Endast medlemmar i
Administrator
-rollen kan komma åtSetTime
åtgärden.
En kontrollant kan skyddas men tillåta anonym, oautentiserad åtkomst till enskilda åtgärder:
[Authorize]
public class Control3PanelController : Controller
{
public IActionResult SetTime() =>
Content("[Authorize]");
[AllowAnonymous]
public IActionResult Login() =>
Content("[AllowAnonymous]");
}
För Razor sidor kan [Authorize]
tillämpas av antingen:
- Använda en -konvention, eller
- Tillämpa
[Authorize]
påPageModel
-instansen:
[Authorize(Policy = "RequireAdministratorRole")]
public class UpdateModel : PageModel
{
public IActionResult OnPost() =>
Content("OnPost RequireAdministratorRole");
}
Viktig
Filterattribut, inklusive AuthorizeAttribute
, kan endast tillämpas på PageModel och kan inte tillämpas på specifika sidhanterarmetoder.
Principbaserade rollkontroller
Rollkrav kan också uttryckas med hjälp av principsyntaxen, där en utvecklare registrerar en princip vid programstart som en del av konfigurationen av auktoriseringstjänsten. Detta inträffar vanligtvis i filen Program.cs
:
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();
Riktlinjer tillämpas med egenskapen Policy på attributet [Authorize]
:
[Authorize(Policy = "RequireAdministratorRole")]
public IActionResult Shutdown()
{
return View();
}
Om du vill ange flera tillåtna roller i ett krav anger du dem som parametrar för metoden RequireRole:
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();
Föregående kod auktoriserar användare som tillhör rollerna Administrator
, PowerUser
eller BackupAdministrator
.
När en identity skapas kan den tillhöra en eller flera roller. Tracy kan till exempel tillhöra administratörs- och användarrollerna medan Scott bara tillhör användarrollen. Hur dessa roller skapas och hanteras beror på lagringsplatsen för auktoriseringsprocessen. Roller exponeras för utvecklaren via metoden IsInRole i klassen ClaimsPrincipal.
Vi rekommenderar att du inte använder Roller som anspråk, utan istället använder ett anspråk. När du använder ensidesappar (SPAs), se Använda Identity för att säkra ett backend för webb-API för SPAs.
Lägga till rollkontroller
Rollbaserade auktoriseringskontroller:
- Är deklarativa.
- Tillämpas på Razor sidor, kontroller eller åtgärder i en kontroll.
- Kan inte tillämpas på Razor sidhanterarnivå måste de tillämpas på sidan.
Rollbaserade auktoriseringskontroller anger vilka roller som den aktuella användaren måste vara medlem i för att få åtkomst till den begärda resursen.
Följande kod begränsar till exempel åtkomsten till alla åtgärder på AdministrationController
till användare som är medlemmar i Administrator
-rollen:
[Authorize(Roles = "Administrator")]
public class AdministrationController : Controller
{
public IActionResult Index() =>
Content("Administrator");
}
Flera roller kan anges som en kommaavgränsad lista:
[Authorize(Roles = "HRManager,Finance")]
public class SalaryController : Controller
{
public IActionResult Payslip() =>
Content("HRManager || Finance");
}
Kontrollanten SalaryController
är endast tillgänglig för användare som är medlemmar i den HRManager
rollen ellerFinance
rollen.
Om du använder flera attribut måste en användare som kommer åt vara medlem i alla angivna roller. Följande exempel kräver att en användare måste vara medlem i både rollen PowerUser
och ControlPanelUser
:
[Authorize(Roles = "PowerUser")]
[Authorize(Roles = "ControlPanelUser")]
public class ControlPanelController : Controller
{
public IActionResult Index() =>
Content("PowerUser && ControlPanelUser");
}
Du kan begränsa åtkomsten ytterligare genom att använda ytterligare rollauktoriseringsattribut på åtgärdsnivå:
[Authorize(Roles = "Administrator, PowerUser")]
public class ControlAllPanelController : Controller
{
public IActionResult SetTime() =>
Content("Administrator || PowerUser");
[Authorize(Roles = "Administrator")]
public IActionResult ShutDown() =>
Content("Administrator only");
}
Om flera attribut tillämpas på kontrollernivå och aktionsnivå måste alla attribut godkännas innan åtkomst beviljas.
[Authorize(Roles = "Administrator")]
public class ControlAllPanelController2 : Controller
{
public IActionResult SetTime() =>
Content("Administrator only");
[Authorize(Roles = "PowerUser")]
public IActionResult ShutDown() =>
Content("Administrator && PowerUser");
}
I den föregående ControlAllPanelController
styrenheten:
- Medlemmar i rollen
Administrator
ellerPowerUser
kan komma åt kontrollanten och åtgärdenSetTime
. - Endast medlemmar i
Administrator
-rollen kan komma åtShutDown
åtgärden.
Du kan också låsa en kontrollant men tillåta anonym, oautentiserad åtkomst till enskilda åtgärder.
[Authorize]
public class Control3PanelController : Controller
{
public IActionResult SetTime() =>
Content("[Authorize]");
[AllowAnonymous]
public IActionResult Login() =>
Content("[AllowAnonymous]");
}
För Razor sidor kan [Authorize]
tillämpas på något av följande sätt:
- Använda en -konvention, eller
- Tillämpa
[Authorize]
på instansenPageModel
:
[Authorize(Policy = "RequireAdministratorRole")]
public class UpdateModel : PageModel
{
public ActionResult OnPost()
{
}
}
Viktig
Filterattribut, inklusive AuthorizeAttribute
, kan endast tillämpas på PageModel och kan inte tillämpas på specifika sidhanterarmetoder.
Principbaserade rollkontroller
Rollkrav kan också uttryckas med hjälp av den nya principsyntaxen, där en utvecklare registrerar en princip vid start som en del av konfigurationen av auktoriseringstjänsten. Detta inträffar normalt i ConfigureServices()
i din Startup.cs
-fil.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddRazorPages();
services.AddAuthorization(options =>
{
options.AddPolicy("RequireAdministratorRole",
policy => policy.RequireRole("Administrator"));
});
}
Principer tillämpas med egenskapen Policy
i attributet [Authorize]
:
[Authorize(Policy = "RequireAdministratorRole")]
public IActionResult Shutdown()
{
return View();
}
Om du vill ange flera tillåtna roller i ett krav kan du ange dem som parametrar för metoden RequireRole
:
options.AddPolicy("ElevatedRights", policy =>
policy.RequireRole("Administrator", "PowerUser", "BackupAdministrator"));
Det här exemplet auktoriserar användare som tillhör rollerna Administrator
, PowerUser
eller BackupAdministrator
.
Lägga till rolltjänster i Identity
Lägg till AddRoles för att lägga till rolltjänster:
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();
}
ASP.NET Core