如何为AddHealthCheckEndpoint()方法添加带身份认证的URL
问题根因
HealthChecks UI 后端通过内置HttpClient主动请求/health端点拉取健康状态,默认配置下该请求不会携带Windows认证凭据,也没有预设认证信息,会被IIS的Windows认证规则拦截返回401未授权,最终UI判定端点不健康。
可行解决方案
方案1:配置静态Windows凭据(匹配静态凭据适配需求)
直接在HealthChecks UI的Http消息处理器配置中,给HttpClientHandler设置固定的Windows认证凭据即可,修改ConfigureServices中的HealthChecksUI注册代码如下:
services.AddHealthChecksUI(opt => { opt.UseApiEndpointHttpMessageHandler(sp => { return new HttpClientHandler { ClientCertificateOptions = ClientCertificateOption.Manual, ServerCertificateCustomValidationCallback = (httpRequestMessage, cert, cetChain, policyErrors) => { return true; }, // 配置静态Windows认证凭据 UseDefaultCredentials = false, Credentials = new System.Net.NetworkCredential( userName: "具备站点访问权限的Windows账号", password: "对应账号的密码", domain: "账号所属域,若为服务器本地账号填写服务器机器名即可" ) }; }); opt.SetEvaluationTimeInSeconds(5); opt.MaximumHistoryEntriesPerEndpoint(60); opt.SetApiMaxActiveRequests(1); // 注意补全http/https前缀,否则HttpClient会出现地址解析错误 opt.AddHealthCheckEndpoint("Site Health", "https://www.example.com/health"); }).AddInMemoryStorage();
该方案存在一定维护成本:账号密码硬编码在代码中存在泄露风险,后续账号密码更新需要同步修改配置,生产环境建议将凭据存储在专用密钥管理服务中,不要硬编码。
方案2:单独给健康检查端点放开匿名访问(生产环境推荐)
健康检查端点仅返回服务运行状态,不涉及敏感业务数据,不需要强制开启Windows认证。你不需要维护静态凭据,仅需在端点映射时给/health路径单独配置匿名访问权限,保持站点其余路径的Windows认证规则不变即可,修改端点配置代码:
endpoints.MapHealthChecks("/health", new HealthCheckOptions() { Predicate = _ => true, ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse }).AllowAnonymous(); // 单独为健康检查端点放开匿名权限 endpoints.MapHealthChecksUI();
如果你的认证规则是在IIS层面配置的,可直接在IIS的授权规则功能中,针对/health路径新增允许匿名用户访问的规则,优先级高于站点全局认证规则即可。该方案无凭据维护成本,是健康检查场景的标准实践。
额外注意事项
原有配置中注册健康检查端点的地址为www.example.com/health,缺少http://或https://前缀,即使认证配置正确,HttpClient也会因地址格式不合法请求失败,无论使用哪种方案都需要补全URI前缀。
内容的提问来源于stack exchange,提问作者TriedAtLeast
相关产品推荐
相关产品推荐

