Autorisatie op basis van claims in ASP.NET Core
Wanneer een identiteit wordt gemaakt, kunnen er een of meer claims worden toegewezen die zijn uitgegeven door een vertrouwde partij. Een claim is een naamwaardepaar dat aangeeft wat het onderwerp is, niet wat het onderwerp kan doen. U hebt bijvoorbeeld een rijbewijs dat is uitgegeven door een lokale rijbewijsautoriteit. Uw rijbewijs heeft uw geboortedatum. In dit geval zou de claimnaam DateOfBirth
zijn, zou de claimwaarde uw geboortedatum zijn, bijvoorbeeld 8th June 1970
en de verlener de rijbewijsautoriteit zou zijn. Op claims gebaseerde autorisatie controleert op de eenvoudigste manier de waarde van een claim en geeft toegang tot een resource op basis van die waarde. Als u bijvoorbeeld toegang wilt tot een nachtclub, kan het autorisatieproces het volgende zijn:
De beveiliger bij de ingang evalueert de waarde van uw geboortedatumclaim en of hij de uitgever (rijbewijsautoriteit) vertrouwt voordat hij u toegang verleent.
Een identiteit kan meerdere claims met meerdere waarden bevatten en kan meerdere claims van hetzelfde type bevatten.
Claimscontroles toevoegen
Controles voor autorisatie op basis van claims
- Zijn declaratief.
- Worden toegepast op Razor pagina's, controllers of acties binnen een controller.
- Kan niet worden toegepast op het niveau van de Razor paginahandler; deze moet dan op de pagina worden toegepast.
Claims in code geven claims op die de huidige gebruiker moet bezitten en eventueel de waarde die de claim moet bevatten voor toegang tot de aangevraagde resource. Claimsvereisten zijn gebaseerd op beleid; de ontwikkelaar moet een beleid bouwen en registreren dat de claimvereisten uitdrukt.
Het eenvoudigste type claimbeleid zoekt naar de aanwezigheid van een claim en controleert de waarde niet.
Bouw en registreer het beleid en roep UseAuthorizationaan. Het registreren van het beleid vindt plaats als onderdeel van de autorisatieserviceconfiguratie, meestal in het bestand Program.cs
:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();
builder.Services.AddAuthorization(options =>
{
options.AddPolicy("EmployeeOnly", policy => policy.RequireClaim("EmployeeNumber"));
});
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();
In dit geval controleert het beleid van EmployeeOnly
of er een EmployeeNumber
-claim aanwezig is op de huidige identiteit.
Pas het beleid toe met behulp van de eigenschap Policy
op het kenmerk [Authorize]
om de beleidsnaam op te geven.
[Authorize(Policy = "EmployeeOnly")]
public IActionResult VacationBalance()
{
return View();
}
Het kenmerk [Authorize]
kan worden toegepast op een volledige controller of Razor Pagina. In dat geval hebben alleen identiteiten die overeenkomen met het beleid toegang tot een actie op de controller.
[Authorize(Policy = "EmployeeOnly")]
public class VacationController : Controller
{
public IActionResult Index()
{
return View();
}
public ActionResult VacationBalance()
{
return View();
}
[AllowAnonymous]
public ActionResult VacationPolicy()
{
return View();
}
}
Met de volgende code wordt het kenmerk [Authorize]
toegepast op een Razor-pagina:
[Authorize(Policy = "EmployeeOnly")]
public class IndexModel : PageModel
{
public void OnGet()
{
}
}
Beleidsregels kunnen niet worden toegepast op het niveau van de Razor Page handler; ze moeten worden toegepast op de Pagina.
Als u een controller hebt die wordt beveiligd door het kenmerk [Authorize]
, maar anonieme toegang tot bepaalde acties wilt toestaan, past u het kenmerk AllowAnonymousAttribute
toe.
[Authorize(Policy = "EmployeeOnly")]
public class VacationController : Controller
{
public IActionResult Index()
{
return View();
}
public ActionResult VacationBalance()
{
return View();
}
[AllowAnonymous]
public ActionResult VacationPolicy()
{
return View();
}
}
Omdat beleidsregels niet kunnen
De meeste claims hebben een waarde. U kunt een lijst met toegestane waarden opgeven bij het maken van het beleid. Het volgende voorbeeld zou alleen slagen voor werknemers waarvan het werknemersnummer 1, 2, 3, 4 of 5 is.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();
builder.Services.AddAuthorization(options =>
{
options.AddPolicy("Founders", policy =>
policy.RequireClaim("EmployeeNumber", "1", "2", "3", "4", "5"));
});
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();
Een algemene claimcontrole toevoegen
Als de claimwaarde niet één waarde is of een transformatie is vereist, gebruikt u RequireAssertion. Zie Een func gebruiken om aan een beleid te voldoenvoor meer informatie.
Evaluatie van meerdere beleidsregels
Als er meerdere beleidsregels worden toegepast op het controller- en actieniveau, moeten alle beleidsregels aan voldaan worden voordat toegang wordt verleend.
[Authorize(Policy = "EmployeeOnly")]
public class SalaryController : Controller
{
public IActionResult Index()
{
return View();
}
public IActionResult Payslip()
{
return View();
}
[Authorize(Policy = "HumanResources")]
public IActionResult UpdateSalary()
{
return View();
}
}
In het voorgaande voorbeeld heeft elke identiteit die voldoet aan het EmployeeOnly
-beleid toegang tot de Payslip
actie, omdat dat beleid wordt afgedwongen op de controller. Om de UpdateSalary
actie aan te roepen, moet de identiteit echter voldoen aan zowel het EmployeeOnly
-beleid als het HumanResources
-beleid.
Als u complexere beleidsregels wilt, zoals het nemen van een geboortedatumclaim, het berekenen van een leeftijd ervan en vervolgens controleren of de leeftijd 21 of ouder is, moet u aangepaste beleidshandlers schrijven.
In het volgende voorbeeld moeten beide pagina-handlermethoden voldoen aan , zowel, het EmployeeOnly
-beleid als het HumanResources
-beleid:
[Authorize(Policy = "EmployeeOnly")]
[Authorize(Policy = "HumanResources")]
public class SalaryModel : PageModel
{
public ContentResult OnGetPayStub()
{
return Content("OnGetPayStub");
}
public ContentResult OnGetSalary()
{
return Content("OnGetSalary");
}
}
Wanneer een identiteit wordt aangemaakt, kunnen er een of meer claims worden toegewezen door een vertrouwde partij. Een claim is een naamwaardepaar dat aangeeft wat het onderwerp is, niet wat het onderwerp kan doen. U hebt bijvoorbeeld een rijbewijs dat is uitgegeven door een lokale rijbewijsautoriteit. Uw rijbewijs heeft uw geboortedatum. In dit geval zou de claimnaam DateOfBirth
zijn, zou de claimwaarde uw geboortedatum zijn, bijvoorbeeld 8th June 1970
en de verlener de rijbewijsautoriteit zou zijn. Op claims gebaseerde autorisatie controleert op de eenvoudigste manier de waarde van een claim en geeft toegang tot een resource op basis van die waarde. Als u bijvoorbeeld toegang wilt tot een nachtclub, kan het autorisatieproces het volgende zijn:
De beveiligingsmedewerker bij de ingang evalueert de waarde van uw geboortedatumverklaring en of hij de rijbewijsauthoriteit vertrouwt voordat toegang wordt verleend.
Een identiteit kan meerdere claims met meerdere waarden bevatten en kan meerdere claims van hetzelfde type bevatten.
Claimscontroles toevoegen
Autorisatiecontroles op basis van claims zijn declaratief: de ontwikkelaar sluit deze in in hun code, op basis van een controller of een actie binnen een controller, waarbij claims worden opgegeven die de huidige gebruiker moet bezitten en eventueel de waarde die de claim moet bevatten voor toegang tot de aangevraagde resource. Claimsvereisten zijn gebaseerd op beleid, de ontwikkelaar moet een beleid bouwen en registreren dat de claimvereisten uitdrukt.
Het eenvoudigste type claimbeleid zoekt naar de aanwezigheid van een claim en controleert de waarde niet.
Bouw en registreer het beleid. Dit gebeurt als onderdeel van de autorisatieserviceconfiguratie, die normaal gesproken deelneemt aan ConfigureServices()
in uw Startup.cs
-bestand.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddRazorPages();
services.AddAuthorization(options =>
{
options.AddPolicy("EmployeeOnly", policy => policy.RequireClaim("EmployeeNumber"));
});
}
Bel UseAuthorization in Configure
. De volgende code wordt gegenereerd door de ASP.NET Core-web-app-sjablonen:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseMigrationsEndPoint();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
In dit geval controleert het EmployeeOnly
beleid of een EmployeeNumber
claim aanwezig is op de huidige identiteit.
Vervolgens past u het beleid toe met behulp van de eigenschap Policy
op het kenmerk [Authorize]
om de beleidsnaam op te geven;
[Authorize(Policy = "EmployeeOnly")]
public IActionResult VacationBalance()
{
return View();
}
Het kenmerk [Authorize]
kan worden toegepast op een volledige controller. In dit geval hebben alleen identiteiten die overeenkomen met het beleid toegang tot een actie op de controller.
[Authorize(Policy = "EmployeeOnly")]
public class VacationController : Controller
{
public ActionResult VacationBalance()
{
}
}
Als u een controller hebt die wordt beveiligd door het kenmerk [Authorize]
, maar anonieme toegang wilt toestaan tot bepaalde acties, past u het kenmerk AllowAnonymousAttribute
toe.
[Authorize(Policy = "EmployeeOnly")]
public class VacationController : Controller
{
public ActionResult VacationBalance()
{
}
[AllowAnonymous]
public ActionResult VacationPolicy()
{
}
}
De meeste claims hebben een waarde. U kunt een lijst met toegestane waarden opgeven bij het maken van het beleid. Het volgende voorbeeld zou alleen slagen voor werknemers waarvan het werknemersnummer 1, 2, 3, 4 of 5 was.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddRazorPages();
services.AddAuthorization(options =>
{
options.AddPolicy("Founders", policy =>
policy.RequireClaim("EmployeeNumber", "1", "2", "3", "4", "5"));
});
}
Een algemene claimcontrole toevoegen
Als de claimwaarde niet één waarde is of een transformatie is vereist, gebruikt u RequireAssertion. Zie Een func gebruiken om aan een beleid te voldoenvoor meer informatie.
Evaluatie van meerdere beleidsregels
Als u meerdere beleidsregels toepast op een controller of actie, moeten alle beleidsregels worden doorgegeven voordat toegang wordt verleend. Bijvoorbeeld:
[Authorize(Policy = "EmployeeOnly")]
public class SalaryController : Controller
{
public ActionResult Payslip()
{
}
[Authorize(Policy = "HumanResources")]
public ActionResult UpdateSalary()
{
}
}
In het bovenstaande voorbeeld heeft elke identiteit die voldoet aan het EmployeeOnly
-beleid toegang tot de Payslip
actie, omdat dat beleid wordt afgedwongen op de controller. Om de UpdateSalary
actie aan te roepen, moet de identiteit echter voldoen aan zowel het EmployeeOnly
-beleid als het HumanResources
-beleid.
Als u complexere beleidsregels wilt, zoals het nemen van een geboortedatumclaim, berekent u een leeftijd van deze claim en controleert u of de leeftijd 21 of ouder is, dan moet u aangepaste beleidshandlers schrijven.
Wanneer een identiteit wordt gecreëerd, kunnen een of meer claims worden toegewezen die zijn uitgegeven door een vertrouwde partij. Een claim is een naamwaardepaar dat aangeeft wat het onderwerp is, niet wat het onderwerp kan doen. U hebt bijvoorbeeld een rijbewijs dat is uitgegeven door een lokale rijbewijsautoriteit. Uw rijbewijs heeft uw geboortedatum. In dit geval zou de claimnaam DateOfBirth
zijn, zou de claimwaarde uw geboortedatum zijn, bijvoorbeeld 8th June 1970
en de verlener de rijbewijsautoriteit zou zijn. Op claims gebaseerde autorisatie controleert op de eenvoudigste manier de waarde van een claim en geeft toegang tot een resource op basis van die waarde. Als u bijvoorbeeld toegang wilt tot een nachtclub, kan het autorisatieproces het volgende zijn:
De beveiligingsmedewerker bij de deur beoordeelt de geldigheid van uw geboortedatumclaim en of zij de instantie (de instantie die het rijbewijs uitgeeft) vertrouwen voordat zij u toegang verlenen.
Een identiteit kan meerdere claims met meerdere waarden bevatten en kan meerdere claims van hetzelfde type bevatten.
Claimscontroles toevoegen
Autorisatiecontroles op basis van claims zijn declaratief: de ontwikkelaar sluit deze in in hun code, op basis van een controller of een actie binnen een controller, waarbij claims worden opgegeven die de huidige gebruiker moet bezitten en eventueel de waarde die de claim moet bevatten voor toegang tot de aangevraagde resource. Claimsvereisten zijn gebaseerd op beleid, de ontwikkelaar moet een beleid bouwen en registreren dat de claimvereisten uitdrukt.
Het eenvoudigste type claimbeleid zoekt naar de aanwezigheid van een claim en controleert de waarde niet.
Bouw en registreer het beleid. Dit gebeurt als onderdeel van de autorisatieserviceconfiguratie, die normaal gesproken deelneemt aan ConfigureServices()
in uw Startup.cs
-bestand.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddRazorPages();
services.AddAuthorization(options =>
{
options.AddPolicy("EmployeeOnly", policy => policy.RequireClaim("EmployeeNumber"));
});
}
In dit geval controleert het EmployeeOnly
beleid op de aanwezigheid van een EmployeeNumber
claim op de huidige identiteit.
Vervolgens past u het beleid toe met behulp van de eigenschap Policy
op het kenmerk [Authorize]
om de beleidsnaam op te geven;
[Authorize(Policy = "EmployeeOnly")]
public IActionResult VacationBalance()
{
return View();
}
Het kenmerk [Authorize]
kan worden toegepast op een volledige controller. In dit geval hebben alleen identiteiten die overeenkomen met het beleid toegang tot een actie op de controller.
[Authorize(Policy = "EmployeeOnly")]
public class VacationController : Controller
{
public ActionResult VacationBalance()
{
}
}
Als u een controller hebt die wordt beveiligd door het kenmerk [Authorize]
, maar anonieme toegang wilt toestaan tot bepaalde acties, past u het kenmerk AllowAnonymousAttribute
toe.
[Authorize(Policy = "EmployeeOnly")]
public class VacationController : Controller
{
public ActionResult VacationBalance()
{
}
[AllowAnonymous]
public ActionResult VacationPolicy()
{
}
}
De meeste claims hebben een waarde. U kunt een lijst met toegestane waarden opgeven bij het maken van het beleid. Het volgende voorbeeld zou alleen slagen voor werknemers waarvan het werknemersnummer 1, 2, 3, 4 of 5 was.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddRazorPages();
services.AddAuthorization(options =>
{
options.AddPolicy("Founders", policy =>
policy.RequireClaim("EmployeeNumber", "1", "2", "3", "4", "5"));
});
}
Een algemene claimcontrole toevoegen
Als de claimwaarde niet één waarde is of een transformatie is vereist, gebruikt u RequireAssertion. Zie Een func gebruiken om aan een beleid te voldoenvoor meer informatie.
Evaluatie van meerdere beleidsregels
Als u meerdere beleidsregels toepast op een controller of actie, moeten alle beleidsregels worden doorgegeven voordat toegang wordt verleend. Bijvoorbeeld:
[Authorize(Policy = "EmployeeOnly")]
public class SalaryController : Controller
{
public ActionResult Payslip()
{
}
[Authorize(Policy = "HumanResources")]
public ActionResult UpdateSalary()
{
}
}
In het bovenstaande voorbeeld heeft elke identiteit die voldoet aan het EmployeeOnly
-beleid toegang tot de Payslip
actie, omdat dat beleid wordt afgedwongen op de controller. Om de UpdateSalary
actie aan te roepen, moet de identiteit echter voldoen aan zowel het EmployeeOnly
-beleid als het HumanResources
-beleid.
Als u complexere beleidsregels wilt, zoals het nemen van een geboortedatumclaim, berekent u een leeftijd van deze claim en controleert u of de leeftijd 21 of ouder is, dan moet u aangepaste beleidshandlers schrijven.