Als u de code voor uw beveiligde web-API wilt configureren, begrijpt u het volgende:
Wat definieert API's als beveiligd.
Een Bearer-token configureren.
Het token valideren.
Wat definieert ASP.NET en ASP.NET Core-API's als beveiligd?
Net als web-apps worden ASP.NET en ASP.NET Core-web-API's beveiligd omdat hun controlleracties worden voorafgegaan door het kenmerk [Autoriseren]. De controlleracties kunnen alleen worden aangeroepen als de API wordt aangeroepen met een geautoriseerde identiteit.
Denk na over de volgende vragen:
Alleen een app kan een web-API aanroepen. Hoe weet de API de identiteit van de app die deze aanroept?
Als de app de API aanroept namens een gebruiker, wat is de identiteit van de gebruiker?
Bearer-token
Het bearer-token dat is ingesteld in de header wanneer de app wordt aangeroepen, bevat informatie over de app-identiteit. Het bevat ook informatie over de gebruiker, tenzij de web-app service-naar-service-aanroepen van een daemon-app accepteert.
Hier volgt een C#-codevoorbeeld met een client die de API aanroept nadat er een token is verkregen met de Microsoft Authentication Library voor .NET (MSAL.NET):
var scopes = new[] {$"api://.../access_as_user"};
var result = await app.AcquireToken(scopes)
.ExecuteAsync();
httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken);
// Call the web API.
HttpResponseMessage response = await _httpClient.GetAsync(apiUri);
Belangrijk
Een clienttoepassing vraagt het Bearer-token aan bij het Microsoft Identity Platform voor de web-API. De API is de enige toepassing die het token moet verifiëren en de claims moet weergeven die het bevat. Client-apps mogen nooit proberen de claims in tokens te inspecteren.
In de toekomst vereist de web-API mogelijk dat het token wordt versleuteld. Deze vereiste voorkomt toegang voor client-apps die toegangstokens kunnen bekijken.
JwtBearer-configuratie
In deze sectie wordt beschreven hoe u een Bearer-token configureert.
Configuratiebestand
U moet de TenantId enige opgeven als u toegangstokens van één tenant (Line-Of-Business-app) wilt accepteren. Anders kan het overblijven als common. De verschillende waarden kunnen zijn:
Een GUID (tenant-id = map-id)
common kan elke organisatie en persoonlijke accounts zijn
Een aangepaste URI voor app-id's gebruiken voor een web-API
Als u de standaard-app-id-URI hebt geaccepteerd die door Azure Portal wordt voorgesteld, hoeft u de doelgroep niet op te geven (zie de URI en bereiken van de toepassings-id). Voeg anders een Audience eigenschap toe waarvan de waarde de app-id-URI voor uw web-API is. Dit begint meestal met api://.
Wanneer een app wordt aangeroepen op een controlleractie met een kenmerk [Autoriseren] , ASP.NET en ASP.NET Core het toegangstoken uit het Bearer-token van de Autorisatie-header extraheren. Het toegangstoken wordt vervolgens doorgestuurd naar de JwtBearer-middleware, die Microsoft IdentityModel Extensions voor .NET aanroept.
Microsoft raadt u aan het NuGet-pakket Microsoft.Identity.Web te gebruiken bij het ontwikkelen van een web-API met ASP.NET Core.
Microsoft.Identity.Web biedt de lijm tussen ASP.NET Core, de verificatie-middleware en de Microsoft Authentication Library (MSAL) voor .NET. Het biedt een duidelijkere, robuustere ontwikkelaarservaring en maakt gebruik van de kracht van het Microsoft Identity Platform en Azure AD B2C.
ASP.NET voor .NET 6.0
Als u een nieuw web-API-project wilt maken dat gebruikmaakt van Microsoft.Identity.Web, gebruikt u een projectsjabloon in de .NET 6.0 CLI of Visual Studio.
Dotnet core CLI
# Create new web API that uses Microsoft.Identity.Web
dotnet new webapi --auth SingleOrg
Visual Studio: als u een web-API-project wilt maken in Visual Studio, selecteert u File>New>Project>ASP.NET Core Web API.
Zowel de .NET CLI- als de Visual Studio-projectsjablonen maken een Program.cs-bestand dat lijkt op dit codefragment. Let op Microsoft.Identity.Web het gebruik van richtlijn en de regels die verificatie en autorisatie bevatten.
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.Identity.Web;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd"));
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
app.Run();
Microsoft raadt u aan het NuGet-pakket Microsoft.Identity.Web.OWIN te gebruiken bij het ontwikkelen van een web-API met ASP.NET.
Microsoft.Identity.Web.OWIN biedt de lijm tussen ASP.NET, de ASP.NET verificatie-middleware en de Microsoft Authentication Library (MSAL) voor .NET. Het biedt een duidelijkere, robuustere ontwikkelaarservaring en maakt gebruik van de kracht van het Microsoft Identity Platform en Azure AD B2C.
Het gebruikt hetzelfde configuratiebestand als ASP.NET Core (appsettings.json) en u moet ervoor zorgen dat dit bestand wordt gekopieerd met de uitvoer van uw project (eigenschap kopiëren altijd in de bestandseigenschappen in Visual Studio of in de .csproj)
Microsoft.Identity.Web.OWIN voegt een uitbreidingsmethoden toe aan IAppBuilder met de naam AddMicrosoftIdentityWebApi. Deze methode neemt als parameter een exemplaar van OwinTokenAcquirerFactory dat u aanroept OwinTokenAcquirerFactory.GetDefaultInstance<OwinTokenAcquirerFactory>() en die een exemplaar weergeeft waarvan IServiceCollection u veel services kunt toevoegen om downstream-API's aan te roepen of de tokencache te configureren.
using Microsoft.Owin.Security;
using Microsoft.Owin.Security.Cookies;
using Owin;
using Microsoft.Identity.Web;
using Microsoft.Identity.Web.TokenCacheProviders.InMemory;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Identity.Client;
using Microsoft.Identity.Abstractions;
using Microsoft.Identity.Web.OWIN;
using System.Web.Services.Description;
namespace OwinWebApp
{
public partial class Startup
{
public void ConfigureAuth(IAppBuilder app)
{
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions());
OwinTokenAcquirerFactory factory = TokenAcquirerFactory.GetDefaultInstance<OwinTokenAcquirerFactory>();
app.AddMicrosoftIdentityWebApp(factory);
factory.Services
.Configure<ConfidentialClientApplicationOptions>(options => { options.RedirectUri = "https://localhost:44386/"; })
.AddMicrosoftGraph()
.AddDownstreamApi("DownstreamAPI1", factory.Configuration.GetSection("DownstreamAPI"))
.AddInMemoryTokenCaches();
factory.Build();
}
}
}
--
Tokenvalidatie
In het voorgaande codefragment valideert de JwtBearer-middleware, zoals de OpenID Connect-middleware in web-apps, het token op basis van de waarde van TokenValidationParameters. Het token wordt indien nodig ontsleuteld, de claims worden geëxtraheerd en de handtekening wordt geverifieerd. De middleware valideert vervolgens het token door te controleren op deze gegevens:
Doelgroep: Het token is bedoeld voor de web-API.
Sub: Deze is uitgegeven voor een app die de web-API mag aanroepen.
Uitgever: Het is uitgegeven door een vertrouwde beveiligingstokenservice (STS).
Verloopdatum: de levensduur is binnen het bereik.
Handtekening: Er is niet geknoeid met.
Er kunnen ook speciale validaties zijn. Het is bijvoorbeeld mogelijk om te valideren dat ondertekeningssleutels, wanneer deze zijn ingesloten in een token, worden vertrouwd en dat het token niet opnieuw wordt afgespeeld. Ten slotte vereisen sommige protocollen specifieke validaties.
Zorgt ervoor dat het token voor de toepassing is die het token voor u valideert.
ValidateIssuer
Zorgt ervoor dat het token is uitgegeven door een vertrouwde STS, wat betekent dat het afkomstig is van iemand die u vertrouwt.
ValidateIssuerSigningKey
Zorgt ervoor dat de toepassing die het token valideert, de sleutel vertrouwt die is gebruikt om het token te ondertekenen. Er is een speciaal geval waarin de sleutel is ingesloten in het token. Maar dit geval doet zich meestal niet voor.
ValidateLifetime
Controleert of het token nog steeds of al geldig is. De validator controleert of de levensduur van het token zich in het bereik bevindt dat is opgegeven door de claims die niet voorafgaan en verlopen .
ValidateSignature
Controleert of er niet met het token is geknoeid.
ValidateTokenReplay
Zorgt ervoor dat het token niet opnieuw wordt afgespeeld. Er is een speciaal geval voor een aantal eenmalige gebruiksprotocollen.
Tokenvalidatie aanpassen
De validaties zijn gekoppeld aan eigenschappen van de klasse TokenValidationParameters . De eigenschappen worden geïnitialiseerd vanuit de ASP.NET- en ASP.NET Core-configuratie.
In de meeste gevallen hoeft u de parameters niet te wijzigen. Apps die geen enkele tenant zijn, zijn uitzonderingen. Deze web-apps accepteren gebruikers van elke organisatie of van persoonlijke Microsoft-accounts. In dit geval moeten verleners worden gevalideerd. Microsoft.Identity.Web zorgt ook voor de validatie van de verlener.
Als u in ASP.NET Core de parameters voor tokenvalidatie wilt aanpassen, gebruikt u het volgende fragment in uw Startup.cs:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(Configuration);
services.Configure<JwtBearerOptions>(JwtBearerDefaults.AuthenticationScheme, options =>
{
options.TokenValidationParameters.ValidAudiences = new[] { /* list of valid audiences */};
});
Voor ASP.NET MVC ziet u in het volgende codevoorbeeld hoe u aangepaste tokenvalidatie kunt uitvoeren:
U kunt ook binnenkomende toegangstokens valideren in Azure Functions. Voorbeelden van dergelijke validatie vindt u in de volgende codevoorbeelden op GitHub: