Microsoft.Identity.Webでロギングを構成します。

Microsoft。Identity.Web は、ASP.NET Coreのログ 記録インフラストラクチャと統合されます。 これを使用して、次の問題を診断します。

  • 認証フロー - サインイン、サインアウト、トークンの検証
  • トークンの取得 - トークン キャッシュヒット/ミス、MSAL 操作
  • ダウンストリーム API 呼び出し - HTTP 要求、API のトークン取得
  • エラー条件 - 例外、検証エラー

ログ記録されたコンポーネントを理解する

コンポーネント ログ ソース Purpose
Microsoft。Identity.Web コア認証ロジック 構成、トークンの取得、API 呼び出し
MSAL.NET Microsoft.Identity.Client トークン キャッシュ操作、機関の検証
IdentityModel トークンの検証 JWT 解析、署名の検証、要求の抽出
ASP.NET Core 認証 Microsoft.AspNetCore.Authentication クッキー操作、検証/禁止するアクション

ログ記録を始める

最小構成

次のログ レベルのエントリを appsettings.json に追加して、ID ログを有効にします。

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.Identity": "Information"
    }
  }
}

これにより、Microsoft.Identity.Web とその依存関係 (MSAL.NET、IdentityModel) の Information レベル のログ記録が有効になります。

開発構成

開発中に詳細な診断を行う場合:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Identity": "Debug",
      "Microsoft.AspNetCore.Authentication": "Information"
    }
  },
  "AzureAd": {
    "EnablePiiLogging": true  // Development only!
  }
}

運用構成

運用環境では、エラーをキャプチャしながらログ ボリュームを最小限に抑えます。

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning",
      "Microsoft": "Warning",
      "Microsoft.Identity": "Warning"
    }
  },
  "AzureAd": {
    "EnablePiiLogging": false  // Never true in production
  }
}

ログ のフィルター処理を構成する

名前空間ベースのフィルター処理

名前空間別にログの詳細度を制御します。 次の構成では、ID 関連の名前空間ごとに詳細なレベルを設定します。

{
  "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"
    }
  }
}

特定のログ記録を無効にする

ノイズの多いコンポーネントを他のコンポーネントに影響を与えずに無音にするには、ログ レベルを None または Warning に設定します。

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.Identity.Web": "None",  // Completely disable
      "Microsoft.Identity.Client": "Warning"  // Only errors/warnings
    }
  }
}

環境固有の構成

環境設定ごとに appsettings.{Environment}.json を使用します。

appsettings.Development.json:

{
  "Logging": {
    "LogLevel": {
      "Microsoft.Identity": "Debug"
    }
  },
  "AzureAd": {
    "EnablePiiLogging": true
  }
}

appsettings.Production.json:

{
  "Logging": {
    "LogLevel": {
      "Microsoft.Identity": "Warning"
    }
  },
  "AzureAd": {
    "EnablePiiLogging": false
  }
}

ログ レベルを理解する

ASP.NET Coreでは、次のログ レベルを定義します。 環境のログ ボリュームに対して診断の詳細のバランスを取るレベルを選択します。

ASP.NET Core のログレベル

レベル 使用方法 ボリューム 生産ですか?
トレース 最も詳細な、すべての操作 非常に高 いいえ
デバッグ 詳細なフロー。開発に役立ちます いいえ
情報 一般的なフロー、キー イベント 適度 選択的
警告 予期しないが処理された条件 はい
エラー エラーと例外 非常に低い はい
重大 回復不可能なエラー 非常に低い はい
なし ログ記録を無効にする なし 選択的

MSAL.NET を ASP.NET Core レベルにマップする

MSAL.NET レベル ASP.NET Coreに相当する 説明
Verbose Debug または Trace 最も詳細なメッセージ
Info Information キー認証イベント
Warning Warning 異常だが正常に処理された状態
Error Error または Critical エラーと例外

環境ごとに次の構成を使用します。

開発:

{
  "Logging": {
    "LogLevel": {
      "Microsoft.Identity": "Debug",
      "Microsoft.Identity.Client": "Information"
    }
  }
}

ステージング:

{
  "Logging": {
    "LogLevel": {
      "Microsoft.Identity": "Information",
      "Microsoft.Identity.Client": "Warning"
    }
  }
}

生産:

{
  "Logging": {
    "LogLevel": {
      "Microsoft.Identity": "Warning",
      "Microsoft.Identity.Client": "Error"
    }
  }
}

PII ログの設定

既定では、Microsoft。Identity.Web は、個人を特定できる情報 (PII) をログから編集します。 開発環境でのみ PII ログを有効にして、完全なユーザーの詳細を表示します。

PII とは

個人を特定できる情報 (PII) には、次のものが含まれます。

  • ユーザー名、メール アドレス
  • 表示名
  • オブジェクト ID、テナント ID
  • IP アドレス
  • トークン値、要求

セキュリティの警告

警告: お客様とアプリケーションは、 GDPR で規定されているものを含め、適用されるすべての規制要件に準拠する責任を負います。 PII ログを有効にする前に、この機密性の高いデータを安全に処理できることを確認してください。

PII ログを有効にする (開発のみ)

EnablePiiLoggingを開発構成ファイルのtrueに設定します。

appsettings.Development.json:

{
  "AzureAd": {
    "EnablePiiLogging": true  //  Development/Testing ONLY
  },
  "Logging": {
    "LogLevel": {
      "Microsoft.Identity": "Debug"
    }
  }
}

プログラムによる PII ログ記録の制御

ホスティング環境に基づいて PII ログを切り替えます。

var builder = WebApplication.CreateBuilder(args);

builder.Services.Configure<MicrosoftIdentityOptions>(options =>
{
    // Only enable PII in Development
    options.EnablePiiLogging = builder.Environment.IsDevelopment();
});

PII を有効にした場合の変更点

PII ログなし:

[Information] Token validation succeeded for user '{hidden}'
[Information] Acquired token from cache for scopes '{hidden}'

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の抹消

PII ログが無効になっている場合、機密データは次のように置き換えられます。

  • {hidden} - ユーザー識別子を非表示にします
  • {hash:XXXX} - 実際の値の代わりにハッシュを表示します
  • *** - トークンを隠す

関連付け ID を使用する

関連付け ID は、サービス間で認証要求をトレースします。 問題の解決を高速化するために、ログやサポートチケットにそれらを含めてください。

関連付け ID とは

関連付け ID は、次の間で認証またはトークン取得要求を一意に識別する GUID です。

  • ご利用のアプリケーション
  • Microsoft ID プラットフォーム
  • MSAL.NET ライブラリ
  • バックエンド サービスのMicrosoft

関連付け ID を取得する

方法 1: AuthenticationResult から取得

トークンの取得が成功した後、 AuthenticationResult から関連付け ID を抽出します。

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);
    }
}

方法 2: MsalServiceException を使用して

トークンの取得が失敗したときに、 MsalServiceException から関連付け ID をキャプチャします。

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
    });
}

方法 3: カスタム関連付け ID を設定する

カスタム関連付け ID を割り当てて、アプリケーション トレースとMicrosoft Entra ID要求をリンクします。

[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);
}

サポート用の関連付け ID を提供する

Microsoftサポートに問い合わせる場合は、次の詳細を入力します。

  1. 関連付け ID - ログまたは例外から
  2. タイムスタンプ - エラーが発生したとき (UTC)
  3. テナント ID - あなたの Microsoft Entra ID テナント
  4. エラー コード - 該当する場合 (例: AADSTS50058)

サポート要求の例:

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

トークン キャッシュのログ記録を有効にする

トークン キャッシュ のログ記録は、キャッシュのヒット/ミスの動作を理解し、分散キャッシュのパフォーマンスの問題を診断するのに役立ちます。

トークン キャッシュ診断を有効にする

分散トークン キャッシュを使用する .NET Framework または .NET Core アプリの場合は、詳細なログ記録を構成します。

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
});

トークン キャッシュ ログの例

キャッシュ ヒット:

[Debug] Token cache: Token found in cache for scopes 'user.read'
[Information] Token source: Cache

キャッシュ ミス:

[Debug] Token cache: No token found in cache for scopes 'user.read'
[Information] Token source: IdentityProvider
[Debug] Token cache: Token stored in cache

分散キャッシュのトラブルシューティング

プロバイダー固有のログ記録を有効にして、キャッシュの接続とパフォーマンスの問題を診断します。

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:

ログを使用して分散キャッシュSQL Server構成します。

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);
});

一般的な問題のトラブルシューティング

次のシナリオを使用して、頻繁に発生する認証と承認の問題を診断します。

一般的なログ記録シナリオ

シナリオ 1: トークン検証エラー

現象: 401 未承認の応答

詳細なログを有効にします。

{
  "Logging": {
    "LogLevel": {
      "Microsoft.AspNetCore.Authentication.JwtBearer": "Debug",
      "Microsoft.IdentityModel": "Information"
    }
  }
}

以下のものを探します。

[Information] Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler:
  Failed to validate the token.
[Debug] Microsoft.IdentityModel.Tokens: IDX10230: Lifetime validation failed.
  The token is expired.

シナリオ 2: トークン取得エラー

現象:MsalServiceException または MsalUiRequiredException

詳細なログを有効にします。

{
  "Logging": {
    "LogLevel": {
      "Microsoft.Identity.Web": "Debug",
      "Microsoft.Identity.Client": "Information"
    }
  }
}

以下のものを探します。

[Error] Microsoft.Identity.Web: Token acquisition failed.
  ErrorCode: invalid_grant, CorrelationId: {guid}
[Information] Microsoft.Identity.Client: MSAL returned exception:
  AADSTS50058: Silent sign-in failed.

シナリオ 3: ダウンストリーム API 呼び出しエラー

症状: ダウンストリーム API を呼び出す HTTP 502 またはタイムアウト エラー

詳細なログを有効にします。

{
  "Logging": {
    "LogLevel": {
      "Microsoft.Identity.Abstractions": "Debug",
      "System.Net.Http": "Information"
    }
  }
}

コントローラーにカスタム ログを追加して、ダウンストリーム API エラーをキャプチャします。

[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");
    }
}

ログ パターンを解釈する

次の例は、一般的な認証イベントの一般的なログ出力を示しています。

成功した認証フロー:

[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}

同意が必要:

[Warning] Microsoft.Identity.Web: Incremental consent required
[Info] AADSTS65001: User consent is required for scopes: {scopes}
[Info] Redirecting to consent page

トークンの更新:

[Debug] Token expired, attempting silent token refresh
[Info] Token source: IdentityProvider
[Info] Token refreshed successfully

外部プロバイダーを使用してログを集計する

監視とアラートのために、一元化されたログ プラットフォームに ID ログを転送します。

Application Insights の統合:

関連付け ID エンリッチメントを使用して Application Insights に ID テレメトリを送信します。

using Microsoft.ApplicationInsights.Extensibility;

builder.Services.AddApplicationInsightsTelemetry();

// Enrich telemetry with correlation IDs
builder.Services.AddSingleton<ITelemetryInitializer, CorrelationIdTelemetryInitializer>();

Serilog の統合:

コンソールとローリング ファイルの出力に ID ログをキャプチャするように Serilog を構成します。

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();

ログのベスト プラクティスに従う

これらのプラクティスを適用して、ID ログをセキュリティで保護し、役立ち、パフォーマンスを維持します。

やるべきこと

1. 構造化ログを使用する:

ログ アグリゲーターがインデックスを作成してクエリできるように、値を名前付きパラメーターとして渡します。

_logger.LogInformation(
    "Token acquired for user {UserId} with scopes {Scopes}",
    userId, string.Join(" ", scopes));

2. ログ相関 ID:

サポートの調査を簡略化するために、常にエラー ログに関連付け ID を含めます。

_logger.LogError(ex,
    "Operation failed. CorrelationId: {CorrelationId}",
    ex.CorrelationId);

3. 適切なログ レベルを使用します。

ログ レベルを重大度と対象ユーザーと一致させます。

_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. 運用環境でログをサニタイズする:

機密性の高い値を運用ログに書き込む前にマスクします。

var sanitizedEmail = environment.IsProduction()
    ? MaskEmail(email)
    : email;
_logger.LogInformation("Processing request for {Email}", sanitizedEmail);

してはいけないこと

1. 運用環境で PII を有効にしないでください。

//  Wrong
"EnablePiiLogging": true  // In production config!

//  Correct
"EnablePiiLogging": false

2. シークレットをログに記録しない:

//  Wrong
_logger.LogInformation("Token: {Token}", accessToken);

//  Correct
_logger.LogInformation("Token acquired, expires: {ExpiresOn}", expiresOn);

3. 運用環境では詳細ログを使用しないでください。

//  Wrong - production appsettings.json
"Microsoft.Identity": "Debug"

//  Correct
"Microsoft.Identity": "Warning"