ASP.Net Core 6应用Azure AD首次登录耗时过长,求优化建议
缓存OpenID Connect元数据
首次登录时应用会拉取Azure AD的OpenID元数据(授权端点、密钥集等),默认可能每次启动都重新请求。可以在AddOpenIdConnect配置里开启元数据缓存,设置合理的缓存时长:services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApp(options => { Configuration.Bind("AzureAd", options); options.MetadataAddress = $"{options.Instance}{options.TenantId}/v2.0/.well-known/openid-configuration"; options.ConfigurationManager = new ConfigurationManager<OpenIdConnectConfiguration>( options.MetadataAddress, new OpenIdConnectConfigurationRetriever(), new HttpDocumentRetriever { RequireHttps = true }) { RefreshInterval = TimeSpan.FromHours(24) // 缓存24小时 }; });优化签名证书缓存
Azure AD的签名证书默认会自动缓存,但要确保不要禁用ConfigurationManager的缓存机制,它会自动管理证书的更新和缓存,避免首次登录时重复验证证书。调整会话与Cookie配置
首次登录会创建会话Cookie,优化Cookie存储和反序列化开销:services.ConfigureApplicationCookie(options => { options.Cookie.HttpOnly = true; options.ExpireTimeSpan = TimeSpan.FromHours(8); // 用内存缓存存储身份票据,减少反序列化次数 options.SessionStore = new MemoryCacheTicketStore(new MemoryCache(new MemoryCacheOptions())); });自己实现
MemoryCacheTicketStore,把票据缓存到内存,避免每次请求都从Cookie反序列化。提前预热认证服务
生产环境应用启动后首次请求会触发JIT编译和依赖初始化,在应用启动时提前初始化认证相关组件:var builder = WebApplication.CreateBuilder(args); // 注册完认证服务后,提前拉取元数据 using var sp = builder.Services.BuildServiceProvider(); var schemeProvider = sp.GetRequiredService<IAuthenticationSchemeProvider>(); var scheme = await schemeProvider.GetSchemeAsync(OpenIdConnectDefaults.AuthenticationScheme); var optionsMonitor = sp.GetRequiredService<IOptionsMonitor<OpenIdConnectOptions>>(); var openIdOptions = optionsMonitor.Get(scheme.Name); await openIdOptions.ConfigurationManager.GetConfigurationAsync(CancellationToken.None);注意处理异步启动的问题,避免阻塞应用启动。
移除认证流程中的阻塞逻辑
检查OnTokenValidated等认证事件里的代码,别把耗时的操作(比如数据库查询、第三方API调用)放在登录流程里,移到后台任务或者只在必要时执行,避免拖慢首次登录。开启Azure App Service的始终开启功能
如果部署在Azure App Service,开启“始终开启”,防止应用因闲置被回收,导致首次登录时需要重新启动应用。排查网络延迟
确认应用服务器和Azure AD端点(如login.microsoftonline.com)之间的网络延迟,用Azure Monitor查看请求耗时,必要时把应用部署到离Azure AD区域更近的位置。
内容的提问来源于stack exchange,提问作者Pandiyan T

