如何记录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
相关产品推荐
相关产品推荐

