MSAL.NET アプリは、問題の診断に役立つログ メッセージを生成します。 数行のコードを使用してログ記録を構成し、詳細レベルと、個人データと組織データをログに記録するかどうかをカスタムで制御できます。 ログ記録は既定では有効になっていません。 MSAL ログを有効にして、ユーザーが認証の問題がある場合にログを送信する方法を提供することをお勧めします。 MSAL はログを格納せず、ロガーの実装で提供される宛先にログを出力します。
Note
MSAL.NET 4.58.0 以降の開発者は、OpenTelemetry を使用してログを集計し、アプリケーションのパフォーマンスを測定することもできます。
ログ記録のレベル
ログの詳細には、いくつかのレベルがあります。
-
LogAlways: MSAL 操作の診断に役立つ重要な正常性メトリックのログを含む基本レベル。 -
Critical: 回復不能なアプリケーションまたはシステムのクラッシュ、または直ちに注意が必要な致命的な障害を示すログ。 -
Error: 問題が発生し、エラーが生成されたことを示します。 問題のデバッグと特定に使用されます。 -
Warning: 必ずしもエラーや障害が発生していない場合でも、診断や問題箇所の特定を目的としたシナリオのログが含まれます。 これは、運用アプリで有効にする必要がある推奨される最小レベルです。 -
Informational: MSAL は、情報を目的としたイベントをログに記録します。必ずしもデバッグを目的としたものではありません。 -
Verbose:MSAL は、ライブラリの動作の詳細をログに記録します。 運用環境では、特定のデバッグ目的でログを収集するために、詳細レベルを一時的にのみ有効にする必要があります。
個人データと組織データ
既定では、MSAL ロガーは機密性の高い個人データや組織データをキャプチャしません。 ライブラリには、個人データと組織データのログ記録を有効にするオプションが用意されています (これを行う場合)。 詳細については、MSAL.NET での個人を特定できる情報の処理を参照してください。
MSAL.NET でログ記録を構成する
MSAL では、 WithLogging(IIdentityLogger, Boolean) ビルダーを使用して、アプリケーションの作成時にログ記録が設定されます。 このメソッドは、次のパラメーターを受け取ります。
-
identityLoggerは、デバッグまたは正常性チェックの目的でログを生成するために MSAL.NET によって使用されるログの実装です。 ログは、ログ記録が有効になっている場合にのみ送信されます。 -
enablePiiLoggingtrue に設定すると、個人データと組織データ (PII) のログ記録が有効になります。 既定では、アプリケーションが機密データをログに記録しないように、このパラメーターは false に設定されます。
IIdentityLogger インターフェイス
namespace Microsoft.IdentityModel.Abstractions
{
public interface IIdentityLogger
{
//
// Summary:
// Checks to see if logging is enabled at given eventLogLevel.
//
// Parameters:
// eventLogLevel:
// Log level of a message.
bool IsEnabled(EventLogLevel eventLogLevel);
//
// Summary:
// Writes a log entry.
//
// Parameters:
// entry:
// Defines a structured message to be logged at the provided Microsoft.IdentityModel.Abstractions.LogEntry.EventLogLevel.
void Log(LogEntry entry);
}
}
Note
上位レベルのライブラリ (Microsoft.Identity.Web、Microsoft.IdentityModel) は、さまざまな環境 (特に ASP.NET Core) に対してこのインターフェイスの実装を既に提供しています。
IIdentityLogger の実装
設定ファイルのログレベル
コードでログ レベルを設定するために、環境内の構成ファイルを使用するようにコードを構成することを強くお勧めします。そのため、アプリケーションをリビルドまたは再起動しなくても、コードで MSAL ログ レベルを変更できます。 これは診断目的で重要であり、運用環境に現在デプロイされているアプリケーションから必要なログをすばやく収集できます。 詳細ログはコストがかかる可能性があるため、既定では Informational レベルを使い、問題が発生したときに詳細ログを有効にすることをお勧めします。 アプリケーションを再起動せずに構成ファイルからデータを読み込む方法の例については、 JSON 構成プロバイダー を参照してください。
環境変数から取得するログレベル
推奨されるもう 1 つのオプションは、コンピューター上の環境変数を使用してログ レベルを設定するようにコードを構成することです。ログ レベルを設定すると、アプリケーションをリビルドしなくても、コードで MSAL ログ レベルを変更できるようになります。
使用可能なログ レベルの詳細については、 EventLogLevel を参照してください。
例:
class MyIdentityLogger : IIdentityLogger
{
public EventLogLevel MinLogLevel { get; }
public MyIdentityLogger()
{
//Retrieve the log level from an environment variable
var msalEnvLogLevel = Environment.GetEnvironmentVariable("MSAL_LOG_LEVEL");
if (Enum.TryParse(msalEnvLogLevel, out EventLogLevel msalLogLevel))
{
MinLogLevel = msalLogLevel;
}
else
{
//Recommended default log level
MinLogLevel = EventLogLevel.Informational;
}
}
public bool IsEnabled(EventLogLevel eventLogLevel)
{
return eventLogLevel <= MinLogLevel;
}
public void Log(LogEntry entry)
{
//Log Message here:
Console.WriteLine(entry.Message);
}
}
MyIdentityLoggerの使用
MyIdentityLogger myLogger = new MyIdentityLogger();
var app = ConfidentialClientApplicationBuilder
.Create(TestConstants.ClientId)
.WithClientSecret("secret")
.WithLogging(myLogger, enablePiiLogging)
.Build();
分散トークン キャッシュでのログ記録
.NET の Microsoft.Identity.Web.TokenCache パッケージのトークン キャッシュ シリアライザーを使用している場合は、追加のキャッシュ ログを有効にできます。
分散キャッシュ ログを有効にするには、 MinLevel プロパティを Debug に設定します。
app.AddDistributedTokenCache(services =>
{
services.AddDistributedMemoryCache();
services.AddLogging(configure => configure.AddConsole())
.Configure<LoggerFilterOptions>(options => options.MinLevel = Microsoft.Extensions.Logging.LogLevel.Debug);
});
詳細については 、「カスタム ログ プロバイダーの実装 」を参照してください。
相関 ID
ログは、クライアント側での MSAL の動作を理解するのに役立ちます。 サービス側で何が起こっているかを理解するには、チームに関連付け ID が必要です。 この ID は、さまざまなバックエンド サービスを介して認証要求をトレースします。
関連付け ID は、次の 3 つの方法で取得できます。
- 成功した認証結果から: AuthenticationResult.CorrelationId。
- サービス例外から: MsalException.CorrelationId。
- トークン要求の作成時にカスタム関連付け ID を WithCorrelationId(Guid) に渡すこと。
独自の関連付け ID を指定する場合は、要求ごとに異なる ID 値を使用します。 要求を区別できないため、定数を使用しないでください。
ネットワークトレース
Important
通常、ネットワーク トレースには個人を特定できる情報と資格情報が含まれます。 GitHubにログを投稿する前に、機密情報を削除します。
詳細ログで十分な分析情報が得られない場合は、 Fiddler や mitmproxy などのツールを使用してネットワーク トレースを取得できます。 選択したツールをローカル プロキシとして構成し、ローカル ネットワーク上のデバイスからのトラフィックを受け入れることで、iPhone や Android フォンなどの他のデバイスからのトレースをキャプチャできます。 ログをキャプチャする前に、プラットフォーム固有の構成が必要になる場合があります。
このようなツールを使用できない場合は、MSAL によって使用される HttpClient を変更して HTTP トラフィックをログに記録できます。 詳細については、 このカスタム HttpClient の実装とログ記録を参照してください。
Warning
このクライアントは、運用環境では使用せず、ログ記録にのみ使用してください。
カスタム HttpClient は次のように追加できます。
var msalPublicClient = PublicClientApplicationBuilder
.Create(ClientId)
.WithHttpClientFactory(new HttpSnifferClientFactory())
.Build();
WAM 使用時のネットワーク トレース
Fiddler を使用してWindowsで Web アカウント マネージャー (WAM) のネットワーク トレースを収集するには、いくつかの追加の手順が必要です。
- Fiddler で AppContainer ループバックを有効にするには、 WinConfig をクリックし、[ すべて除外 ] を選択して変更を保存します。
- HTTPS 復号化を有効にしますが、HTTPS 復号化から ADFS (
msft.sts.microsoft.com) を除外します。