Förstå hur du konfigurerar koden för ditt skyddade webb-API:
Vad definierar API:er som skyddade.
Så här konfigurerar du en ägartoken.
Verifiera token.
Vad definierar ASP.NET och ASP.NET Core API:er som skyddade?
Precis som webbappar skyddas ASP.NET och ASP.NET Core-webb-API:er eftersom deras kontrollantåtgärder är prefix med attributet [Auktorisera]. Kontrollantåtgärderna kan bara anropas om API:et anropas med en auktoriserad identitet.
Överväg följande frågor:
Endast en app kan anropa ett webb-API. Hur känner API:et till identiteten för den app som anropar den?
Vad är användarens identitet om appen anropar API:et för en användares räkning?
Ägartoken
Ägartoken som anges i huvudet när appen anropas innehåller information om appidentiteten. Den innehåller också information om användaren såvida inte webbappen accepterar tjänst-till-tjänst-anrop från en daemon-app.
Här är ett C#-kodexempel som visar en klient som anropar API:et när den har hämtat en token med Microsoft Authentication Library för .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);
Viktigt!
Ett klientprogram begär ägartoken till Microsofts identitetsplattform för webb-API:et. API:et är det enda program som ska verifiera token och visa de anspråk som den innehåller. Klientappar bör aldrig försöka inspektera anspråken i token.
I framtiden kan webb-API:et kräva att token krypteras. Det här kravet skulle förhindra åtkomst för klientappar som kan visa åtkomsttoken.
JwtBearer-konfiguration
I det här avsnittet beskrivs hur du konfigurerar en ägartoken.
Konfigurationsfil
Du behöver bara ange om TenantId du vill acceptera åtkomsttoken från en enda klientorganisation (verksamhetsspecifik app). Annars kan den lämnas som common. De olika värdena kan vara:
Ett GUID (klient-ID = katalog-ID)
common kan vara valfri organisation och personliga konton
organizations kan vara vilken organisation som helst
Om du har accepterat standardapp-ID:t som föreslås av Azure Portal behöver du inte ange målgruppen (se Program-ID-URI och omfång). Annars lägger du till en Audience egenskap vars värde är app-ID-URI:n för ditt webb-API. Detta börjar vanligtvis med api://.
När en app anropas för en kontrollantåtgärd som innehåller ett [Auktorisera] -attribut extraherar ASP.NET och ASP.NET Core åtkomsttoken från auktoriseringshuvudets ägartoken. Åtkomsttoken vidarebefordras sedan till JwtBearer-mellanprogrammet, som anropar Microsoft IdentityModel Extensions för .NET.
Microsoft.Identity.Web tillhandahåller limmet mellan ASP.NET Core, mellanprogrammet för autentisering och Microsoft Authentication Library (MSAL) för .NET. Det ger en tydligare och mer robust utvecklarupplevelse och utnyttjar kraften i Microsofts identitetsplattform och Azure AD B2C.
ASP.NET för .NET 6.0
Om du vill skapa ett nytt webb-API-projekt som använder Microsoft.Identity.Web använder du en projektmall i .NET 6.0 CLI eller Visual Studio.
Dotnet core CLI
# Create new web API that uses Microsoft.Identity.Web
dotnet new webapi --auth SingleOrg
Visual Studio – Om du vill skapa ett webb-API-projekt i Visual Studio väljer du Fil>nytt>projekt>ASP.NET Core Web API.
Både .NET CLI- och Visual Studio-projektmallarna skapar en Program.cs fil som liknar det här kodfragmentet. Observera Microsoft.Identity.Web att du använder direktivet och raderna som innehåller autentisering och auktorisering.
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.Identity.Web.OWIN tillhandahåller limmet mellan ASP.NET, mellanprogrammet för ASP.NET autentisering och Microsoft Authentication Library (MSAL) för .NET. Det ger en tydligare och mer robust utvecklarupplevelse och utnyttjar kraften i Microsofts identitetsplattform och Azure AD B2C.
Den använder samma konfigurationsfil som ASP.NET Core (appsettings.json) och du måste se till att den här filen kopieras med utdata från projektet (egenskapskopiering alltid i filegenskaperna i Visual Studio eller i .csproj)
Microsoft.Identity.Web.OWIN lägger till en tilläggsmetod i IAppBuilder med namnet AddMicrosoftIdentityWebApi. Den här metoden tar som parameter en instans av OwinTokenAcquirerFactory som du får anrop OwinTokenAcquirerFactory.GetDefaultInstance<OwinTokenAcquirerFactory>() till och som visar en instans där IServiceCollection du kan lägga till många tjänster för att anropa underordnade API:er eller konfigurera tokencachen.
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();
}
}
}
--
Tokenverifiering
I föregående kodfragment validerar JwtBearer-mellanprogrammet, som OpenID Connect-mellanprogrammet i webbappar, token baserat på värdet TokenValidationParametersför . Token dekrypteras efter behov, anspråken extraheras och signaturen verifieras. Mellanprogrammet verifierar sedan token genom att söka efter dessa data:
Målgrupp: Token är mål för webb-API:et.
Under: Den utfärdades för en app som kan anropa webb-API:et.
Utfärdare: Den utfärdades av en betrodd säkerhetstokentjänst (STS).
Förfallodatum: Dess livslängd är inom intervallet.
Signatur: Det manipulerades inte.
Det kan också finnas särskilda valideringar. Det går till exempel att verifiera att signeringsnycklar, när de bäddas in i en token, är betrodda och att token inte spelas upp igen. Slutligen kräver vissa protokoll specifika valideringar.
Ser till att token är för programmet som verifierar token åt dig.
ValidateIssuer
Säkerställer att token har utfärdats av en betrodd STS, vilket innebär att den kommer från någon du litar på.
ValidateIssuerSigningKey
Säkerställer att programmet som verifierar token litar på nyckeln som användes för att signera token. Det finns ett specialfall där nyckeln är inbäddad i token. Men det här fallet uppstår vanligtvis inte.
ValidateLifetime
Säkerställer att token fortfarande eller redan är giltig. Valideraren kontrollerar om tokens livslängd ligger i det intervall som anges av anspråken notbefore och upphör att gälla .
ValidateSignature
Ser till att token inte har manipulerats.
ValidateTokenReplay
Ser till att token inte spelas upp igen. Det finns ett specialfall för vissa engångsprotokoll.
Anpassa tokenverifiering
Validatorerna är associerade med egenskaperna för klassen TokenValidationParameters . Egenskaperna initieras från konfigurationen ASP.NET och ASP.NET Core.
I de flesta fall behöver du inte ändra parametrarna. Appar som inte är enstaka klientorganisationer är undantag. Dessa webbappar accepterar användare från valfri organisation eller från personliga Microsoft-konton. Utfärdare i det här fallet måste verifieras. Microsoft.Identity.Web tar även hand om utfärdarvalidering.
Om du vill anpassa tokenverifieringsparametrarna i ASP.NET Core använder du följande kodfragment i Startup.cs:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(Configuration);
services.Configure<JwtBearerOptions>(JwtBearerDefaults.AuthenticationScheme, options =>
{
options.TokenValidationParameters.ValidAudiences = new[] { /* list of valid audiences */};
});
För ASP.NET MVC visar följande kodexempel hur du utför validering av anpassad token: