You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何记录GraphServiceClient生成的认证流量?(.NET Framework 4.8环境)

解决方案

用TokenCredentialOptions.Diagnostics配置内置日志就行

Azure.Identity的TokenCredentialOptions里的Diagnostics属性本身就支持内置日志,完全不用第三方库,刚好能满足你记录认证时间、耗时的需求,还不用抓请求响应内容。

1. 配置日志回调

初始化TokenCredential(不管是ClientSecretCredential还是InteractiveBrowserCredential这类)的时候,直接给TokenCredentialOptions的Diagnostics.Logging加个回调逻辑,就能捕获认证相关事件:

var credentialOptions = new TokenCredentialOptions
{
    Diagnostics =
    {
        Logging =
        {
            IsEnabled = true, // 必须开这个才会触发日志
            LoggedHeaderNames = new List<string>(), // 不需要请求头就留空
            LoggedQueryParameters = new List<string>(), // 不需要查询参数也留空
            Callback = (level, message) =>
            {
                // 只挑认证相关的关键事件,比如开始认证、获取到令牌的消息
                if (message.Contains("Beginning authentication") || message.Contains("Acquired token"))
                {
                    var timestamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff");
                    // 这里可以改成写入文件、本地日志组件,我用控制台示例
                    Console.WriteLine($"[{timestamp}] {message}");
                }
            }
        }
    }
};

// 用配置好的选项创建凭证
var credential = new ClientSecretCredential(tenantId, clientId, clientSecret, credentialOptions);

2. 统计认证耗时

要算耗时的话,在回调里跟踪开始时间就行,拿到令牌完成的消息时计算差值:

DateTime? authStartTime = null;

var credentialOptions = new TokenCredentialOptions
{
    Diagnostics =
    {
        Logging =
        {
            IsEnabled = true,
            Callback = (level, message) =>
            {
                var timestamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff");
                if (message.Contains("Beginning authentication"))
                {
                    authStartTime = DateTime.Now;
                    Console.WriteLine($"[{timestamp}] 认证开始");
                }
                else if (message.Contains("Acquired token"))
                {
                    if (authStartTime.HasValue)
                    {
                        var duration = DateTime.Now - authStartTime.Value;
                        Console.WriteLine($"[{timestamp}] 认证完成,耗时:{duration.TotalMilliseconds:F2}ms");
                        authStartTime = null;
                    }
                }
            }
        }
    }
};

为啥你的DelegatingHandler抓不到认证流量?

因为Microsoft Graph SDK的认证请求是TokenCredential直接发的,根本不经过你加给GraphServiceClient的DelegatingHandler——这个Handler只能管Graph API本身的请求,碰不到认证那部分的流量。

几个注意点

  • 必须把IsEnabled设为true,否则日志回调根本不会触发。
  • 回调里的message会包含认证全流程的事件,你可以自己过滤,避免日志太多。
  • level参数是日志级别,正常认证流程用的是Information级,报错的时候会是Warning或Error,也可以根据这个过滤。

内容的提问来源于stack exchange,提问作者Yvand

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 16:35:13