Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Microsoft. Identity.Web biedt meerdere methoden voor het aanroepen van downstream-API's, waaronder Microsoft Graph, Azure-services en aangepaste REST API's, vanuit uw ASP.NET Core-, OWIN- of .NET-toepassingen. Dit artikel helpt u bij het kiezen van de juiste benadering voor uw scenario en snel aan de slag te gaan.
Benadering selecteren
Gebruik deze beslissingsstructuur om de beste methode voor uw scenario te selecteren:
| API-type/scenario | Beslissingen/criteria | Aanbevolen client/klasse |
|---|---|---|
| Microsoft Graph | U moet Microsoft Graph API's aanroepen | GraphServiceClient |
| Azure SDK (Opslag, KeyVault, enzovoort) | U moet Azure API's aanroepen (Azure SDK) | MicrosoftIdentityTokenCredential met Azure SDK-clients |
| Aangepaste API met tokenbinding | Verbeterde beveiliging met certificaatbinding (mTLS PoP) | IDownstreamApi met ProtocolScheme: "MTLS_POP" |
| Aangepaste API met tokenbinding | Verbeterde beveiliging met HttpClient-integratie (mTLS PoP) | MicrosoftIdentityMessageHandler met ProtocolScheme: "MTLS_POP" |
| Aangepaste API | Eenvoudig, configureerbaar | IDownstreamApi |
| Aangepaste API | httpclient gebruiken en handler delegeren | MicrosoftIdentityMessageHandler |
| Aangepaste API | uw HttpClient gebruiken | IAuthorizationHeaderProvider |
Vergelijking van benaderingen op complexiteit en flexibiliteit
De volgende tabel bevat een overzicht van elke benadering op basis van de beoogde use-case, complexiteitsniveau en flexibiliteit.
| Methode | Het beste voor | Complexiteit | Configuratie | Flexibiliteit |
|---|---|---|---|---|
| GraphServiceClient | API's voor Microsoft Graph | Low | Simple | Gemiddeld |
| MicrosoftIdentityTokenCredential | Azure SDK clients | Low | Simple | Low |
| IDownstreamApi | REST API's met standaardpatronen | Low | JSON + Code | Gemiddeld |
| MicrosoftIdentityMessageHandler | HttpClient met verificatiepijplijn | Gemiddeld | Code | Hoog |
| IAuthorizationHeaderProvider | Aangepaste authenticatielogica | Hoog | Code | Zeer hoog |
Patronen voor tokenverwerving
Microsoft. Identity.Web ondersteunt drie belangrijkste patronen voor het verkrijgen van tokens:
graph LR
A[Token Acquisition] --> B[Delegated<br/>On behalf of user]
A --> C[App-Only<br/>Application permissions in all apps]
A --> D[On-Behalf-Of OBO<br/>in web API]
B --> B1[Web Apps]
B --> B2[Daemon acting as user / user agent]
C --> C1[Daemon Apps]
C --> C2[Web APIs with app permissions]
D --> D1[Web APIs calling other APIs]
style B fill:#cfe2ff
style C fill:#fff3cd
style D fill:#f8d7da
Gedelegeerde machtigingen (gebruikerstokens)
Gebruik gedelegeerde machtigingen wanneer uw toepassing namens een aangemelde gebruiker handelt.
- Scenario: Web-app roept API aan namens aangemelde gebruiker en autonome agentgebruikersidentiteit.
- Tokentype: Toegangstoken met gedelegeerde machtigingen
-
Methoden:
CreateAuthorizationHeaderForUserAsync(),GetForUserAsync()
Toepassingsmachtigingen (tokens voor alleen-apps)
Gebruik toepassingsmachtigingen wanneer er geen gebruiker aanwezig is en de app zichzelf authentiseert.
- Scenario: Daemon-app of API voor achtergrondserviceaanroepen. Autonome agentidentiteit
- Tokentype: Toegangstoken met toepassingsmachtigingen
-
Methoden:
CreateAuthorizationHeaderForAppAsync(),GetForAppAsync()
Proces Op-Aanvraag-Van (OBO)
Gebruik de OBO-stroom wanneer een web-API een andere downstream-API moet aanroepen terwijl de identiteit van de gebruiker behouden blijft.
- Scenario: Web-API ontvangt een gebruikerstoken, roept een andere API aan namens die gebruiker en interactieve agents.
- Tokentype: Nieuw toegangstoken via OBO-stroom
-
Methoden:
CreateAuthorizationHeaderForUserAsync()van web-API-context
Token-binding (mTLS PoP)
Tokenbinding voegt een extra beveiligingslaag toe door cryptografisch toegangstokens te koppelen aan X.509-certificaten.
- Scenario: Verbeterde beveiliging waarbij tokens cryptografisch zijn gebonden aan certificaten volgens RFC 8705
-
Tokentype: Toegangstoken met certificaatbinding (
cnfclaim) -
Methoden:
GetForAppAsync()metProtocolScheme: "MTLS_POP" - Beveiliging: Voorkomt diefstal van tokens door bindingstokens aan specifieke certificaten
Meer informatie over tokenbinding met mTLS PoP
Voorbeelden van quickstart-code
In de volgende voorbeelden ziet u elke benadering met end-to-end code die u kunt aanpassen aan uw toepassing.
Microsoft Graph (aanbevolen voor Graph-API's)
In het volgende voorbeeld wordt GraphServiceClient geregistreerd en gebruikt om Microsoft Graph aan te roepen namens de aangemelde gebruiker en als een app-aanroep.
// Installation
// dotnet add package Microsoft.Identity.Web.GraphServiceClient
// Startup configuration
using Microsoft.Identity.Web;
builder.Services.AddMicrosoftGraph();
// Usage in controller
public class HomeController : Controller
{
private readonly GraphServiceClient _graphClient;
public HomeController(GraphServiceClient graphClient)
{
_graphClient = graphClient;
}
public async Task<IActionResult> Profile()
{
// Delegated - calls on behalf of signed-in user
var user = await _graphClient.Me.GetAsync();
// App-only - requires app permissions
var users = await _graphClient.Users
.GetAsync(r => r.Options.WithAppOnly());
return View(user);
}
}
Meer informatie over Microsoft Graph integratie
GraphServiceClient-migratie en gedetailleerd gebruik
Azure-SDK's (aanbevolen voor Azure services)
In het volgende voorbeeld wordt MicrosoftIdentityTokenCredential geregistreerd en doorgegeven aan een Azure Blob Storage-client.
// Installation
// dotnet add package Microsoft.Identity.Web.Azure
// dotnet add package Azure.Storage.Blobs
// Startup configuration
using Microsoft.Identity.Web;
builder.Services.AddMicrosoftIdentityAzureTokenCredential();
// Usage
public class StorageService
{
private readonly MicrosoftIdentityTokenCredential _credential;
public StorageService(MicrosoftIdentityTokenCredential credential)
{
_credential = credential;
}
public async Task<List<string>> ListBlobsAsync()
{
var blobClient = new BlobServiceClient(
new Uri("https://myaccount.blob.core.windows.net"),
_credential);
var container = blobClient.GetBlobContainerClient("mycontainer");
var blobs = new List<string>();
await foreach (var blob in container.GetBlobsAsync())
{
blobs.Add(blob.Name);
}
return blobs;
}
}
Meer informatie over Azure SDK integratie
IDownstreamApi (aanbevolen voor aangepaste REST API's)
In het volgende voorbeeld wordt een benoemde downstream-API geconfigureerd appsettings.json en wordt deze aangeroepen met zowel gedelegeerde als alleen-app-tokens.
// Installation
// dotnet add package Microsoft.Identity.Web.DownstreamApi
// appsettings.json
{
"DownstreamApis": {
"MyApi": {
"BaseUrl": "https://myapi.example.com",
"Scopes": ["api://myapi/read", "api://myapi/write"]
}
}
}
// Startup configuration
using Microsoft.Identity.Web;
builder.Services.AddDownstreamApis(
builder.Configuration.GetSection("DownstreamApis"));
// Usage
public class ApiService
{
private readonly IDownstreamApi _api;
public ApiService(IDownstreamApi api)
{
_api = api;
}
public async Task<Product> GetProductAsync(int id)
{
// Delegated - on behalf of user
return await _api.GetForUserAsync<Product>(
"MyApi",
$"api/products/{id}"
);
}
public async Task<List<Product>> GetAllProductsAsync()
{
// App-only - using app permissions
return await _api.GetForAppAsync<List<Product>>(
"MyApi",
"api/products");
}
}
Meer informatie over IDownstreamApi
Tokenbinding met mTLS PoP (verbeterde beveiliging)
Tokenbinding biedt verbeterde beveiliging door cryptografische toegangstokens te binden aan X.509-certificaten. Zelfs als een token wordt onderschept, kan het niet worden gebruikt zonder het bijbehorende certificaat.
// Installation
// dotnet add package Microsoft.Identity.Web.DownstreamApi
// appsettings.json
{
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"TenantId": "your-tenant-id",
"ClientId": "your-client-id",
"ClientCredentials": [
{
"SourceType": "StoreWithDistinguishedName",
"CertificateStorePath": "CurrentUser/My",
"CertificateDistinguishedName": "CN=YourCertificate"
}
],
"SendX5c": true
},
"SecureApi": {
"BaseUrl": "https://api.contoso.com/",
"RelativePath": "api/data",
"ProtocolScheme": "MTLS_POP",
"RequestAppToken": true,
"Scopes": [ "api://your-api/.default" ]
}
}
// Startup configuration
builder.Services.AddDownstreamApi(
"SecureApi",
builder.Configuration.GetSection("SecureApi"));
// Usage
public class SecureApiService
{
private readonly IDownstreamApi _api;
public SecureApiService(IDownstreamApi api)
{
_api = api;
}
public async Task<SecureData> GetSecureDataAsync()
{
// Token is bound to certificate - enhanced security
return await _api.GetForAppAsync<SecureData>("SecureApi");
}
}
Belangrijke voordelen:
- Beveiliging tegen diefstal van tokens: gestolen tokens zijn nutteloos zonder het certificaat
- Aanvalspreventie opnieuw afspelen: tokens kunnen niet opnieuw worden afgespeeld vanaf verschillende clients
- Uitlijning van nulvertrouwen: sterke cryptografische binding tussen client en token
Meer informatie over tokenbinding (mTLS PoP)
MicrosoftIdentityMessageHandler (voor HttpClient-integratie)
In het volgende voorbeeld wordt een delegeringshandler toegevoegd aan een HttpClient aanvraag, zodat elke uitgaande aanvraag automatisch een autorisatieheader bevat. De handler registreert bereiken bij het opstarten, en individuele verzoeken kunnen tokenopties overschrijven.
// Startup configuration
using Microsoft.Identity.Web;
builder.Services.AddHttpClient("MyApiClient", client =>
{
client.BaseAddress = new Uri("https://myapi.example.com");
})
.AddHttpMessageHandler(sp => new MicrosoftIdentityMessageHandler(
sp.GetRequiredService<IAuthorizationHeaderProvider>(),
new MicrosoftIdentityMessageHandlerOptions
{
Scopes = new[] { "api://myapi/.default" }
}));
// Usage
public class ApiService
{
private readonly HttpClient _httpClient;
public ApiService(IHttpClientFactory httpClientFactory)
{
_httpClient = httpClientFactory.CreateClient("MyApiClient");
}
public async Task<Product> GetProductAsync(int id)
{
var request = new HttpRequestMessage(HttpMethod.Get, $"api/products/{id}")
.WithAuthenticationOptions(options =>
{
options.RequestAppToken = false; // Use delegated token
options.scopes = [ "myApi.scopes" ];
});
var response = await _httpClient.SendAsync(request);
response.EnsureSuccessStatusCode();
return await response.Content.ReadFromJsonAsync<Product>();
}
}
Meer informatie over MicrosoftIdentityMessageHandler
IAuthorizationHeaderProvider (maximale flexibiliteit)
In het volgende voorbeeld wordt een autorisatieheader rechtstreeks opgehaald, zodat u deze kunt koppelen aan een HTTP-aanvraag naast aangepaste headers.
// Direct usage for custom scenarios
public class CustomAuthService
{
private readonly IAuthorizationHeaderProvider _headerProvider;
public CustomAuthService(IAuthorizationHeaderProvider headerProvider)
{
_headerProvider = headerProvider;
}
public async Task<string> CallApiAsync()
{
// Get auth header (includes "Bearer " + token)
string authHeader = await _headerProvider
.CreateAuthorizationHeaderForUserAsync(
scopes: new[] { "api://myapi/.default" });
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization", authHeader);
client.DefaultRequestHeaders.Add("X-Custom-Header", "MyValue");
var response = await client.GetStringAsync("https://myapi.example.com/data");
return response;
}
}
Meer informatie over IAuthorizationHeaderProvider
Configuratiepatronen
Microsoft. Identity.Web ondersteunt zowel JSON-configuratie als op code gebaseerde configuratie.
configuratie van appsettings.json
In de volgende JSON ziet u een typische configuratie waarmee Microsoft Entra ID referenties en twee downstream-API's worden geregistreerd.
{
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"TenantId": "your-tenant-id",
"ClientId": "your-client-id",
"ClientCredentials": [
{
"SourceType": "SignedAssertionFromManagedIdentity"
}
]
},
"DownstreamApis": {
"MicrosoftGraph": {
"BaseUrl": "https://graph.microsoft.com/v1.0",
"Scopes": ["User.Read", "Mail.Read"]
},
"MyApi": {
"BaseUrl": "https://myapi.example.com",
"Scopes": ["api://myapi/read"]
}
}
}
Opmerking
Voor daemon-/console-apps configureert u de appsettings.json instellingen: "Kopiëren naar uitvoermap" = "Kopiëren als nieuwer"
Meer informatie over configuratie van referenties
Configuratie op basis van code
U kunt ook referenties en downstream-API's volledig in code configureren, zoals in het volgende voorbeeld wordt weergegeven.
// Explicit configuration in code
builder.Services.Configure<MicrosoftIdentityApplicationOptions>(options =>
{
options.Instance = "https://login.microsoftonline.com/";
options.TenantId = "your-tenant-id";
options.ClientId = "your-client-id";
options.ClientCredentials = new[]
{
CertificateDescription.FromKeyVault(
"https://myvault.vault.azure.net",
"MyCertificate")
};
});
builder.Services.AddDownstreamApi("MyApi", options =>
{
options.BaseUrl = "https://myapi.example.com";
options.Scopes = new[] { "api://myapi/read" };
});
Scenariospecifieke handleidingen
De beste aanpak is afhankelijk van waar u de API aanroept:
Web-app-integratie
Web-apps roepen doorgaans downstream-API's aan namens de aangemelde gebruiker.
- Primair patroon: Gedelegeerde machtigingen (namens de gebruiker)
- Token ophalen: gebeurt automatisch tijdens het aanmelden
- Speciale overwegingen: Stapsgewijze toestemming, het verwerken van toestemmingfouten
Web-API-integratie
Web-API's maken gebruik van de on-Behalf-Of-stroom om een binnenkomende gebruikerstoken uit te wisselen voor een nieuw token dat is gericht op de downstream-API.
- Primair patroon: Stroom aanBehalf-Of (OBO)
- Tokenverwerving: Exchange binnenkomende token voor downstreamtoken
- Speciale overwegingen: langlopende processen, tokencaching, agentidentiteiten.
De handleiding voor web-API's lezen
Integratie van daemon-apps
Daemon-apps verifiëren zich als zichzelf zonder een aangemelde gebruiker.
- Primair patroon: Toepassingsmachtigingen (alleen voor apps)
- Token ophalen: stroom voor clientreferenties
- Speciale overwegingen: geen gebruikerscontext, vereist beheerderstoestemming
- Geavanceerd: Autonome agents, gebruikersidentiteiten van agents
Lees de handleiding voor Daemon-toepassingen
Foutafhandeling voor het verkrijgen van tokens
Alle methoden voor het verkrijgen van tokens kunnen uitzonderingen genereren die door uw toepassing moeten worden verwerkt.
In web-apps verwerkt het [AuthorizeForScope(scopes)] kenmerk incrementele toestemming van de gebruiker of het opnieuw ondertekenen.
In het volgende voorbeeld ziet u hoe u veelvoorkomende uitzonderingen voor het verkrijgen van tokens kunt ondervangen en verwerken.
using Microsoft.Identity.Abstractions;
try
{
var result = await _api.GetForUserAsync<Data>("MyApi", "api/data");
}
catch (MicrosoftIdentityWebChallengeUserException ex)
{
// User needs to sign in or consent to additional scopes
// In web apps, this triggers a redirect to Microsoft Entra ID
throw;
}
catch (HttpRequestException ex)
{
// Downstream API returned error
_logger.LogError(ex, "API call failed");
}
Veelvoorkomende foutscenario's
De volgende tabel bevat de meest voorkomende uitzonderingen en hoe u deze kunt oplossen.
| Exception | Meaning | Solution |
|---|---|---|
MicrosoftIdentityWebChallengeUserException |
Gebruikerstoestemming vereist | Omleiden naar Microsoft Entra ID voor toestemming. Het kenmerk AuthorizeForScopes of de klasse ConsentHandler gebruiken |
MsalUiRequiredException |
Interactieve verificatie vereist | Afhandelen in web-apps met uitdaging |
MsalServiceException |
Microsoft Entra ID-servicefout | Configuratie controleren, opnieuw proberen |
HttpRequestException |
Downstream-API-fout | API-specifieke fouten verwerken |
Vereiste NuGet-pakketten
Kies het pakket dat overeenkomt met uw scenario. De volgende tabel bevat elk pakket en wanneer u het wilt gebruiken.
| Package | Purpose | Wanneer gebruiken |
|---|---|---|
| Microsoft. Identity.Web.TokenAcquisition | Services voor het verkrijgen van tokens | Kernpakket |
| Microsoft. Identity.Web.DownstreamApi | IDownstreamApi-abstractie | REST API's aanroepen |
| Microsoft. Identity.Web.GraphServiceClient | integratie van Microsoft Graph | Microsoft Graph aanroepen (handleiding voor migratie) |
| Microsoft. Identity.Web. Azure | integratie van Azure SDK | Azure-services aanroepen |
| Microsoft. Identity.Web | ASP.NET Core webapps en web-API's | ASP.NET Core |
| Microsoft. Identity.Web.OWIN | ASP.NET OWIN-webapps en web-API's | OWIN |
Verwante inhoud
Verken deze handleidingen voor een gedetailleerd overzicht en geavanceerde scenario's.