Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Microsoft. Identity.Web innehåller flera metoder för att anropa underordnade API:er, inklusive Microsoft Graph, Azure-tjänster och anpassade REST-API:er, från dina ASP.NET Core-, OWIN- eller .NET-program. Den här artikeln hjälper dig att välja rätt metod för ditt scenario och komma igång snabbt.
Metodval
Använd det här beslutsträdet för att välja den bästa metoden för ditt scenario:
| API-typ/scenario | Beslut/kriterier | Rekommenderad klient/klass |
|---|---|---|
| Microsoft Graph | Du måste anropa Microsoft Graph API:er | GraphServiceClient |
| Azure SDKs (Lagring, KeyVault osv.) | Du måste anropa Azure API:er (Azure SDKs) | MicrosoftIdentityTokenCredential med Azure SDKs klienter |
| Anpassat API med tokenbindning | Förbättrad säkerhet med certifikatbindning (mTLS PoP) | IDownstreamApi med ProtocolScheme: "MTLS_POP" |
| Anpassat API med tokenbindning | Förbättrad säkerhet med HttpClient-integrering (mTLS PoP) | MicrosoftIdentityMessageHandler med ProtocolScheme: "MTLS_POP" |
| Anpassat API | Enkelt, konfigurerbart | IDownstreamApi |
| Anpassat API | använda HttpClient + delegeringshanterare | MicrosoftIdentityMessageHandler |
| Anpassat API | använda din HttpClient | IAuthorizationHeaderProvider |
Metodjämförelse med komplexitet och flexibilitet
I följande tabell sammanfattas varje metod med det avsedda användningsfallet, komplexitetsnivån och flexibiliteten.
| Tillvägagångssätt | Bäst för | Komplexitet | Konfiguration | Flexibilitet |
|---|---|---|---|---|
| GraphServiceClient | Microsoft Graph API:er | Låg | Enkel | Medium |
| MicrosoftIdentityTokenCredential | Azure SDKs klienter | Låg | Enkel | Låg |
| IDownstreamApi | REST-API:er med standardmönster | Låg | JSON + Kod | Medium |
| MicrosoftIdentityMessageHandler | HttpClient med autentiseringspipeline | Medium | Kod | Hög |
| IAuthorizationHeaderProvider | Anpassad autentiseringslogik | Hög | Kod | Väldigt hög |
Mönster för tokenförvärv
Microsoft. Identity.Web har stöd för tre huvudsakliga tokenförvärvsmönster:
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
Delegerade behörigheter (användartoken)
Använd delegerade behörigheter när ditt program agerar för en inloggad användares räkning.
- Scenario: Webbappen anropar API för en inloggad användare och den autonoma agentens användaridentitet.
- Tokentyp: Åtkomsttoken med delegerade behörigheter
-
Metoder:
CreateAuthorizationHeaderForUserAsync(),GetForUserAsync()
Programbehörigheter (endast apptoken)
Använd programbehörigheter när ingen användare finns och appen autentiseras som sig själv.
- Scenario: Daemon-appen eller bakgrundstjänsten anropar API. Den autonoma agentens identitet
- Tokentyp: Åtkomsttoken med programbehörigheter
-
Metoder:
CreateAuthorizationHeaderForAppAsync(),GetForAppAsync()
Flöde för På Uppdrag Av (OBO)
Använd OBO-flödet när ett webb-API behöver anropa ett annat underordnat API samtidigt som användarens identitet bevaras.
- Scenario: Webb-API tar emot användartoken, anropar ett annat API för användaren och interaktiva agenter.
- Tokentyp: Ny åtkomsttoken via OBO-flöde
-
Metoder:
CreateAuthorizationHeaderForUserAsync()från webb-API-kontext
Tokenbindning (mTLS PoP)
Tokenbindning lägger till ett extra säkerhetslager genom att kryptografiskt binda åtkomsttoken till X.509-certifikat.
- Scenario: Förbättrad säkerhet där token är kryptografiskt bundna till certifikat enligt RFC 8705
-
Tokentyp: Åtkomsttoken med bindning till certifikat (
cnfpåstående) -
Metoder:
GetForAppAsync()medProtocolScheme: "MTLS_POP" - Säkerhet: Förhindrar tokenstöld genom att binda token till specifika certifikat
Läs mer om tokenbindning med mTLS PoP
Exempel på snabbstartskod
Följande exempel visar varje metod med kod från slutpunkt till slutpunkt som du kan anpassa till ditt program.
Microsoft Graph (rekommenderas för Graph API:er)
I följande exempel registreras GraphServiceClient och använder det för att anropa Microsoft Graph för den inloggade användarens räkning och som ett appsamtal.
// 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);
}
}
Läs mer om Microsoft Graph integrering
GraphServiceClient-migrering och detaljerad användning
Azure-SDK:er (rekommenderas för Azure tjänster)
I följande exempel registreras MicrosoftIdentityTokenCredential och skickas till en Azure Blob Storage-klient.
// 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;
}
}
Läs mer om Azure SDKs integrering
IDownstreamApi (rekommenderas för anpassade REST-API:er)
I följande exempel konfigureras ett namngivet underordnat API i appsettings.json och anropar det med både delegerade token och endast apptoken.
// 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");
}
}
Tokenbindning med mTLS PoP (förbättrad säkerhet)
Tokenbindning ger förbättrad säkerhet genom krypteringsbindning av åtkomsttoken till X.509-certifikat. Även om en token fångas upp kan den inte användas utan motsvarande certifikat.
// 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");
}
}
Viktiga fördelar:
- Skydd mot tokenstöld: Stulna token är värdelösa utan certifikatet
- Skydd mot reprisattacker: Token kan inte spelas upp från olika klienter
- Noll förtroendejustering: Stark kryptografisk bindning mellan klient och token
Läs mer om tokenbindning (mTLS PoP)
MicrosoftIdentityMessageHandler (för HttpClient-integrering)
I följande exempel läggs en delegeringshanterare till en HttpClient så att varje utgående begäran automatiskt innehåller ett auktoriseringshuvud. Hanteraren registrerar omfång vid start och enskilda begäranden kan åsidosätta tokenalternativ.
// 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>();
}
}
Läs mer om MicrosoftIdentityMessageHandler
IAuthorizationHeaderProvider (högsta flexibilitet)
I följande exempel hämtas en auktoriseringsrubrik direkt så att du kan koppla den till alla HTTP-begäranden tillsammans med anpassade rubriker.
// 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;
}
}
Läs mer om IAuthorizationHeaderProvider
Konfigurationsmönster
Microsoft. Identity.Web stöder både JSON-konfiguration och kodbaserad konfiguration.
appsettings.json-konfiguration
Följande JSON visar en typisk konfiguration som registrerar Microsoft Entra ID autentiseringsuppgifter och två underordnade API:er.
{
"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"]
}
}
}
Observera
För daemon-/konsolappar anger du appsettings.json egenskaper: "Kopiera till utdatakatalog" = "Kopiera om nyare"
Läs mer om konfiguration av autentiseringsuppgifter
Kodbaserad konfiguration
Du kan också konfigurera autentiseringsuppgifter och underordnade API:er helt i kod, vilket visas i följande exempel.
// 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" };
});
Scenariospecifika guider
Den bästa metoden beror på var du anropar API:et från:
Integration av webbappar
Webbappar anropar vanligtvis underordnade API:er för den inloggade användarens räkning.
- Primärt mönster: Delegerade behörigheter (för användarens räkning)
- Tokenförvärv: Sker automatiskt vid inloggning
- Särskilda överväganden: Inkrementellt medgivande, hantering av medgivandefel
Webb-API-integrering
Web-API:er använder On-Behalf-Of-flödet för att byta ut en inkommande användartoken mot en ny token avsedd för det underliggande API:et.
- Primärt mönster: OBO-flöde (On-Behalf-Of)
- Token-förvärv: Byt inkommande token mot en nedströms-token
- Särskilda överväganden: Tidskrävande processer, cachelagring av token, agentidentiteter.
Daemon-appintegrering
Daemon-appar autentiseras som sig själva utan en inloggad användare.
- Primärt mönster: Programbehörigheter (endast app)
- Tokenförvärv: Klientautentiseringsflöde
- Särskilda överväganden: Ingen användarkontext, kräver administratörsmedgivande
- Avancerat: Autonoma agenter, agentanvändares identiteter
Läs guiden Daemon Applications (Daemon-program)
Felhantering för tokenförvärv
Alla metoder för tokenförvärv kan utlösa undantag som programmet ska hantera.
I webbappar [AuthorizeForScope(scopes)] hanterar attributet användarens inkrementella medgivande eller omsignering.
I följande exempel visas hur du fångar upp och hanterar vanliga undantag för tokenförvärv.
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");
}
Vanliga felscenarier
I följande tabell visas de vanligaste undantagen och hur du löser dem.
| Undantag | Innebörd | Lösning |
|---|---|---|
MicrosoftIdentityWebChallengeUserException |
Användarmedgivande krävs | Omdirigera till Microsoft Entra ID för medgivande. Använda attributet AuthorizeForScopes eller klassen ConsentHandler |
MsalUiRequiredException |
Interaktiv autentisering krävs | Hantera utmaningar i webbappar |
MsalServiceException |
Microsoft Entra ID tjänstfel | Kontrollera konfigurationen, försök igen |
HttpRequestException |
Nedströms-API-fel | Hantera API-specifika fel |
Nödvändiga NuGet-paket
Välj det paket som matchar ditt scenario. I följande tabell visas varje paket och när det ska användas.
| Package | Avsikt | När det bör användas |
|---|---|---|
| Microsoft. Identity.Web.TokenAcquisition | Tjänster för tokenförvärv | Kärnpaket |
| Microsoft. Identity.Web.DownstreamApi | Abstraktion för IDownstreamApi | Anropa REST-API:er |
| Microsoft. Identity.Web.GraphServiceClient | Microsoft Graph-integration | Anropa Microsoft Graph (migrationsguide) |
| Microsoft. Identity.Web. Azure | Azure SDKs integrering | Anropa Azure-tjänster |
| Microsoft. Identity.Web | ASP.NET Core webbappar och webb-API:er | ASP.NET Core |
| Microsoft. Identity.Web.OWIN | ASP.NET OWIN-webbappar och webb-API:er | OWIN |
Relaterat innehåll
Utforska dessa guider för detaljerade genomgångar och avancerade scenarier.