Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Microsoft. Identity.Web ist in die Protokollierungsinfrastruktur ASP.NET Core integriert. Verwenden Sie sie, um Probleme in folgenden Punkten zu diagnostizieren:
- Authentifizierungsflüsse – Anmeldung, Abmelden, Tokenüberprüfung
- Tokenerwerb – Tokencachetreffer und -fehltreffer, MSAL-Vorgänge
- Nachgeschaltete API-Aufrufe – HTTP-Anforderungen , Tokenerwerb für APIs
- Fehlerbedingungen – Ausnahmen, Überprüfungsfehler
Verstehen der protokollierten Komponenten
| Bestandteil | Protokollquelle | Purpose |
|---|---|---|
| Microsoft. Identity.Web | Kernauthentifizierungslogik | Konfiguration, Tokenerwerb, API-Aufrufe |
| MSAL.NET | Microsoft.Identity.Client |
Tokencachevorgänge, Autoritätsüberprüfung |
| IdentityModel- | Tokenüberprüfung | JWT-Analyse, Signaturüberprüfung, Anspruchsextraktion |
| ASP.NET Core Auth | Microsoft.AspNetCore.Authentication |
Cookie-Vorgänge, Herausforderungs-/Verbotsaktionen |
Erste Schritte mit der Protokollierung
Minimale Konfiguration
Fügen Sie die folgenden Einträge auf Protokollebene hinzu, um die Identitätsprotokollierung zu appsettings.json aktivieren:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.Identity": "Information"
}
}
}
Dies ermöglicht Informationsebeneprotokollierung für Microsoft. Identity.Web und seine Abhängigkeiten (MSAL.NET, IdentityModel).
Entwicklungskonfiguration
Detaillierte Diagnose während der Entwicklung:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Identity": "Debug",
"Microsoft.AspNetCore.Authentication": "Information"
}
},
"AzureAd": {
"EnablePiiLogging": true // Development only!
}
}
Produktionskonfiguration
Minimieren Sie für die Produktion das Protokollvolumen beim Erfassen von Fehlern:
{
"Logging": {
"LogLevel": {
"Default": "Warning",
"Microsoft": "Warning",
"Microsoft.Identity": "Warning"
}
},
"AzureAd": {
"EnablePiiLogging": false // Never true in production
}
}
Konfigurieren der Protokollfilterung
Namespacebasierte Filterung
Steuerung der Ausführlichkeit des Protokolls nach Namespace. Die folgende Konfiguration legt granulare Ebenen für jeden identitätsbezogenen Namespace fest:
{
"Logging": {
"LogLevel": {
"Default": "Information",
// General Microsoft namespaces
"Microsoft": "Warning",
"Microsoft.AspNetCore": "Warning",
// Identity-specific namespaces
"Microsoft.Identity": "Information",
"Microsoft.Identity.Web": "Information",
"Microsoft.Identity.Client": "Information",
// ASP.NET Core authentication
"Microsoft.AspNetCore.Authentication": "Information",
"Microsoft.AspNetCore.Authentication.JwtBearer": "Information",
"Microsoft.AspNetCore.Authentication.OpenIdConnect": "Debug",
// Token validation
"Microsoft.IdentityModel": "Warning"
}
}
}
Deaktivieren der bestimmten Protokollierung
Um laute Komponenten stumm zu halten, ohne andere zu beeinträchtigen, legen Sie deren Protokollebene auf None oder Warning:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.Identity.Web": "None", // Completely disable
"Microsoft.Identity.Client": "Warning" // Only errors/warnings
}
}
}
Umgebungsspezifische Konfiguration
Verwenden Sie appsettings.{Environment}.json für Umgebungseinstellungen.
appsettings.Development.json:
{
"Logging": {
"LogLevel": {
"Microsoft.Identity": "Debug"
}
},
"AzureAd": {
"EnablePiiLogging": true
}
}
appsettings.Production.json:
{
"Logging": {
"LogLevel": {
"Microsoft.Identity": "Warning"
}
},
"AzureAd": {
"EnablePiiLogging": false
}
}
Verständnis von Protokollebenen
ASP.NET Core definiert die folgenden Protokollierungsstufen. Wählen Sie die Ebene aus, auf der diagnosedetails mit dem Protokollvolume für Ihre Umgebung ausgeglichen werden.
ASP.NET Core Protokollebenen
| Grad | Verwendung | Volumen | Produktion? |
|---|---|---|---|
| Spur | Am detailliertesten, jeder Vorgang | Sehr hoch | No |
| Debuggen | Detaillierter Ablauf, nützlich für Entwickler | Hoch | No |
| Informationen | Allgemeiner Fluss, Wichtige Ereignisse | Mäßig | Selektive |
| Warnung | Unerwartete, aber behandelte Bedingungen | Niedrig | Ja |
| Fehler | Fehler und Ausnahmen | Sehr niedrig | Ja |
| Kritisch | Nicht wiederherstellbare Fehler | Sehr niedrig | Ja |
| None | Protokollierung deaktivieren | Nichts | Selektive |
Zuordnen MSAL.NET zu ASP.NET Core Ebenen
| MSAL.NET Ebene | ASP.NET Core Gegenstück | Beschreibung |
|---|---|---|
Verbose |
Debug oder Trace |
Detaillierteste Nachrichten |
Info |
Information |
Schlüsselauthentifizierungsereignisse |
Warning |
Warning |
Abnorme, aber behandelte Bedingungen |
Error |
Error oder Critical |
Fehler und Ausnahmen |
Anwenden empfohlener Einstellungen nach Umgebung
Verwenden Sie die folgenden Konfigurationen pro Umgebung.
Entwicklung:
{
"Logging": {
"LogLevel": {
"Microsoft.Identity": "Debug",
"Microsoft.Identity.Client": "Information"
}
}
}
Staging:
{
"Logging": {
"LogLevel": {
"Microsoft.Identity": "Information",
"Microsoft.Identity.Client": "Warning"
}
}
}
Produktion:
{
"Logging": {
"LogLevel": {
"Microsoft.Identity": "Warning",
"Microsoft.Identity.Client": "Error"
}
}
}
Konfigurieren der PII-Protokollierung
Standardmäßig Microsoft. Identity.Web redagiert personenbezogene Informationen (PII) aus Protokollen. Aktivieren Sie die PII-Protokollierung nur in Entwicklungsumgebungen, um vollständige Benutzerdetails anzuzeigen.
Was ist PII?
Personenbezogene Informationen (PERSONALly Identifiable Information, PII) umfassen:
- Benutzernamen, E-Mail-Adressen
- Anzeigenamen
- Objekt-IDs, Mandanten-IDs
- IP-Adressen
- Tokenwerte, Ansprüche
Sicherheitswarnung
WARNUNG: Sie und Ihre Anwendung sind dafür verantwortlich, alle geltenden gesetzlichen Anforderungen, einschließlich der bestimmungen der DSGVO, einzuhalten. Bevor Sie die PII-Protokollierung aktivieren, stellen Sie sicher, dass Sie diese potenziell streng vertraulichen Daten sicher verarbeiten können.
PII-Protokollierung aktivieren (nur für die Entwicklung)
Legen Sie EnablePiiLogging als true in Ihrer Entwicklungskonfigurationsdatei fest.
appsettings.Development.json:
{
"AzureAd": {
"EnablePiiLogging": true // Development/Testing ONLY
},
"Logging": {
"LogLevel": {
"Microsoft.Identity": "Debug"
}
}
}
Programmgesteuertes Steuern der PII-Protokollierung
Umschalten der PII-Protokollierung je nach der Hosting-Umgebung.
var builder = WebApplication.CreateBuilder(args);
builder.Services.Configure<MicrosoftIdentityOptions>(options =>
{
// Only enable PII in Development
options.EnablePiiLogging = builder.Environment.IsDevelopment();
});
Welche Änderungen mit aktivierter PII?
Ohne PII-Protokollierung:
[Information] Token validation succeeded for user '{hidden}'
[Information] Acquired token from cache for scopes '{hidden}'
Mit aktivierter PII:
[Information] Token validation succeeded for user 'john.doe@contoso.com'
[Information] Acquired token from cache for scopes 'user.read api://my-api/.default'
PII-Redaction in Protokollen
Wenn die PII-Protokollierung deaktiviert ist, werden vertrauliche Daten durch Folgendes ersetzt:
-
{hidden}- Blendet Nutzerbezeichner aus -
{hash:XXXX}- Zeigt Hash anstelle des tatsächlichen Werts an. -
***- Verschleiert Tokens
Verwenden von Korrelations-IDs
Korrelations-IDs verfolgen Authentifizierungsanforderungen über Dienste hinweg. Fügen Sie sie in Protokolle und Supporttickets ein, um die Problembehebung zu beschleunigen.
Was sind Korrelations-IDs?
Eine Korrelations-ID ist eine GUID , die eine Authentifizierungs- oder Tokenakquisitionsanforderung eindeutig identifiziert:
- Ihre Anwendung
- Microsoft-Identitätsplattform
- MSAL.NET-Bibliothek
- Microsoft Back-End-Dienste
Abrufen von Korrelations-IDs
Methode 1: Von AuthenticationResult
Extrahieren Sie die Korrelations-ID aus AuthenticationResult nach einem erfolgreichen Tokenerwerb.
using Microsoft.Identity.Web;
public class TodoController : ControllerBase
{
private readonly ITokenAcquisition _tokenAcquisition;
private readonly ILogger<TodoController> _logger;
public TodoController(
ITokenAcquisition tokenAcquisition,
ILogger<TodoController> logger)
{
_tokenAcquisition = tokenAcquisition;
_logger = logger;
}
[HttpGet]
public async Task<IActionResult> GetTodos()
{
var result = await _tokenAcquisition.GetAuthenticationResultForUserAsync(
new[] { "user.read" });
_logger.LogInformation(
"Token acquired. CorrelationId: {CorrelationId}, Source: {TokenSource}",
result.CorrelationId,
result.AuthenticationResultMetadata.TokenSource);
return Ok(result.CorrelationId);
}
}
Methode 2: Mithilfe von MsalServiceException
Erfassen Sie die Korrelations-ID von MsalServiceException, wenn der Tokenerwerb fehlschlägt.
using Microsoft.Identity.Client;
try
{
var token = await _tokenAcquisition.GetAccessTokenForUserAsync(
new[] { "user.read" });
}
catch (MsalServiceException ex)
{
_logger.LogError(ex,
"Token acquisition failed. CorrelationId: {CorrelationId}, ErrorCode: {ErrorCode}",
ex.CorrelationId,
ex.ErrorCode);
// Return correlation ID to user for support
return StatusCode(500, new {
error = "authentication_failed",
correlationId = ex.CorrelationId
});
}
Methode 3: Festlegen einer benutzerdefinierten Korrelations-ID
Weisen Sie eine benutzerdefinierte Korrelations-ID zu, um Anwendungsablaufverfolgungen mit Microsoft Entra ID Anforderungen zu verknüpfen:
[HttpGet("{id}")]
public async Task<IActionResult> GetTodo(int id)
{
// Use request trace ID as correlation ID
var correlationId = Activity.Current?.Id ?? HttpContext.TraceIdentifier;
var todo = await _downstreamApi.GetForUserAsync<Todo>(
"TodoListService",
options =>
{
options.RelativePath = $"api/todolist/{id}";
options.TokenAcquisitionOptions = new TokenAcquisitionOptions
{
CorrelationId = Guid.Parse(correlationId)
};
});
_logger.LogInformation(
"Called downstream API. TraceId: {TraceId}, CorrelationId: {CorrelationId}",
HttpContext.TraceIdentifier,
correlationId);
return Ok(todo);
}
Bereitstellen von Korrelations-IDs zur Unterstützung
Wenn Sie sich an Microsoft Support wenden, geben Sie die folgenden Details an:
- Korrelations-ID – Aus Protokollen oder Ausnahmen
- Zeitstempel – Zeitpunkt des Auftretens des Fehlers (UTC)
- Tenant-ID – Ihr Microsoft Entra ID Mandant
-
Fehlercode – Falls zutreffend (z. B.
AADSTS50058)
Beispiel-Supportanfrage:
Subject: Token acquisition failing for user.read scope
Correlation ID: 12345678-1234-1234-1234-123456789012
Timestamp: 2025-01-15 14:32:45 UTC
Tenant ID: contoso.onmicrosoft.com
Error Code: AADSTS50058
Tokencacheprotokollierung aktivieren
Die Tokencacheprotokollierung hilft Ihnen, das Cache-Treffer und -Fehlverhalten zu verstehen und Leistungsprobleme bei verteilten Caches zu diagnostizieren.
Aktivieren der Tokencachediagnose
Konfigurieren Sie für .NET Framework oder .NET Core-Apps mit verteilten Tokencaches die detaillierte Protokollierung:
using Microsoft.Extensions.Logging;
using Microsoft.Identity.Web.TokenCacheProviders;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDistributedTokenCaches();
// Enable detailed token cache logging
builder.Services.AddLogging(configure =>
{
configure.AddConsole();
configure.AddDebug();
})
.Configure<LoggerFilterOptions>(options =>
{
options.MinLevel = LogLevel.Debug; // Detailed cache operations
});
Beispiele für Token-Cache-Protokoll
Cachetreffer:
[Debug] Token cache: Token found in cache for scopes 'user.read'
[Information] Token source: Cache
Cachefehler:
[Debug] Token cache: No token found in cache for scopes 'user.read'
[Information] Token source: IdentityProvider
[Debug] Token cache: Token stored in cache
Problembehandlung für verteilte Caches
Aktivieren Sie die anbieterspezifische Protokollierung, um Cachekonnektivitäts- und Leistungsprobleme zu diagnostizieren.
Redis-Cache:
builder.Services.AddStackExchangeRedisCache(options =>
{
options.Configuration = builder.Configuration["Redis:ConnectionString"];
});
// Enable Redis logging
builder.Services.AddLogging(configure =>
{
configure.AddFilter("Microsoft.Extensions.Caching", LogLevel.Debug);
});
SQL Server cache:
Konfigurieren sie SQL Server verteilten Cache mit Protokollierung:
builder.Services.AddDistributedSqlServerCache(options =>
{
options.ConnectionString = builder.Configuration["SqlCache:ConnectionString"];
options.SchemaName = "dbo";
options.TableName = "TokenCache";
});
// Enable SQL cache logging
builder.Services.AddLogging(configure =>
{
configure.AddFilter("Microsoft.Extensions.Caching.SqlServer", LogLevel.Information);
});
Häufige Probleme beheben
Verwenden Sie die folgenden Szenarien, um häufige Authentifizierungs- und Autorisierungsprobleme zu diagnostizieren.
Häufige Protokollierungsszenarien
Szenario 1: Tokenüberprüfungsfehler
Symptom: 401 Nicht autorisierte Reaktionen
Aktivieren der detaillierten Protokollierung:
{
"Logging": {
"LogLevel": {
"Microsoft.AspNetCore.Authentication.JwtBearer": "Debug",
"Microsoft.IdentityModel": "Information"
}
}
}
Suchen nach:
[Information] Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler:
Failed to validate the token.
[Debug] Microsoft.IdentityModel.Tokens: IDX10230: Lifetime validation failed.
The token is expired.
Szenario 2: Tokenerwerbsfehler
Symptom:MsalServiceException Oder MsalUiRequiredException
Aktivieren der detaillierten Protokollierung:
{
"Logging": {
"LogLevel": {
"Microsoft.Identity.Web": "Debug",
"Microsoft.Identity.Client": "Information"
}
}
}
Suchen nach:
[Error] Microsoft.Identity.Web: Token acquisition failed.
ErrorCode: invalid_grant, CorrelationId: {guid}
[Information] Microsoft.Identity.Client: MSAL returned exception:
AADSTS50058: Silent sign-in failed.
Szenario 3: Nachgeschaltete API-Aufruffehler
Symptom: HTTP 502- oder Timeoutfehler beim Aufrufen von downstream-APIs
Aktivieren der detaillierten Protokollierung:
{
"Logging": {
"LogLevel": {
"Microsoft.Identity.Abstractions": "Debug",
"System.Net.Http": "Information"
}
}
}
Fügen Sie ihrem Controller eine benutzerdefinierte Protokollierung hinzu, um nachgeschaltete API-Fehler zu erfassen:
[HttpGet]
public async Task<IActionResult> GetUserProfile()
{
try
{
_logger.LogInformation("Acquiring token for Microsoft Graph");
var user = await _downstreamApi.GetForUserAsync<User>(
"MicrosoftGraph",
options => options.RelativePath = "me");
_logger.LogInformation(
"Successfully retrieved user profile for {UserPrincipalName}",
user.UserPrincipalName);
return Ok(user);
}
catch (MsalUiRequiredException ex)
{
_logger.LogWarning(ex,
"User interaction required. CorrelationId: {CorrelationId}",
ex.CorrelationId);
return Challenge();
}
catch (HttpRequestException ex)
{
_logger.LogError(ex, "Failed to call Microsoft Graph API");
return StatusCode(502, "Downstream API error");
}
}
Interpretieren von Protokollmustern
Die folgenden Beispiele zeigen typische Protokollausgabe für allgemeine Authentifizierungsereignisse.
Erfolgreicher Authentifizierungsfluss:
[Info] Authentication scheme OpenIdConnect: Authorization response received
[Debug] Correlation id: {guid}
[Info] Authorization code received
[Info] Token validated successfully
[Info] Authentication succeeded for user: {user}
Zustimmung erforderlich:
[Warning] Microsoft.Identity.Web: Incremental consent required
[Info] AADSTS65001: User consent is required for scopes: {scopes}
[Info] Redirecting to consent page
Tokenaktualisierung:
[Debug] Token expired, attempting silent token refresh
[Info] Token source: IdentityProvider
[Info] Token refreshed successfully
Protokolle mit externen Anbietern aggregieren
Leiten Sie Identitätsprotokolle zur Überwachung und Warnung an eine zentrale Protokollierungsplattform weiter.
Integration von Application Insights:
Senden von Identitätstelemetrie an Application Insights mit Korrelations-ID-Anreicherung:
using Microsoft.ApplicationInsights.Extensibility;
builder.Services.AddApplicationInsightsTelemetry();
// Enrich telemetry with correlation IDs
builder.Services.AddSingleton<ITelemetryInitializer, CorrelationIdTelemetryInitializer>();
Serilog-Integration:
Konfigurieren Sie Serilog so, dass Authentifizierungsprotokolle in Konsolenausgaben und rollierenden Dateiausgaben erfasst werden.
using Serilog;
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Information()
.MinimumLevel.Override("Microsoft.Identity", Serilog.Events.LogEventLevel.Debug)
.Enrich.FromLogContext()
.WriteTo.Console()
.WriteTo.File("logs/identity-.txt", rollingInterval: RollingInterval.Day)
.CreateLogger();
builder.Host.UseSerilog();
Befolgen bewährter Methoden für die Protokollierung
Wenden Sie diese Methoden an, um Ihre Identitätsprotokolle sicher, nützlich und leistungsfähig zu halten.
Empfohlen
1. Verwenden Sie die strukturierte Protokollierung:
Übergeben Sie Werte als benannte Parameter, damit Protokollaggregatoren sie indizieren und abfragen können:
_logger.LogInformation(
"Token acquired for user {UserId} with scopes {Scopes}",
userId, string.Join(" ", scopes));
2. Protokollkorrelations-IDs:
Schließen Sie immer die Korrelations-ID in Fehlerprotokolle ein, um Supportuntersuchungen zu vereinfachen:
_logger.LogError(ex,
"Operation failed. CorrelationId: {CorrelationId}",
ex.CorrelationId);
3. Verwenden Sie geeignete Loglevel:
Zuordnen der Protokollebene zum Schweregrad und zur Zielgruppe:
_logger.LogDebug("Detailed diagnostic info"); // Development
_logger.LogInformation("Key application events"); // Selective production
_logger.LogWarning("Unexpected but handled"); // Production
_logger.LogError(ex, "Operation failed"); // Production
4. Protokolle in der Produktion sanieren:
Maskieren Sie vertrauliche Werte, bevor Sie sie in Produktionsprotokolle schreiben:
var sanitizedEmail = environment.IsProduction()
? MaskEmail(email)
: email;
_logger.LogInformation("Processing request for {Email}", sanitizedEmail);
DONT‘s
1. Aktivieren Sie piI in der Produktion nicht:
// Wrong
"EnablePiiLogging": true // In production config!
// Correct
"EnablePiiLogging": false
2. Protokollieren Sie keine Geheimnisse:
// Wrong
_logger.LogInformation("Token: {Token}", accessToken);
// Correct
_logger.LogInformation("Token acquired, expires: {ExpiresOn}", expiresOn);
3. Verwenden Sie keine ausführliche Protokollierung in der Produktion:
// Wrong - production appsettings.json
"Microsoft.Identity": "Debug"
// Correct
"Microsoft.Identity": "Warning"