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

ASP.NET Core集成Prometheus采集端点时ctx.User认证状态异常求助

问题根源与解决方案

核心原因

你的问题出在认证中间件的作用范围和MapWhen的执行逻辑上:

  1. 若你在Bearer认证配置中设置了路径过滤(比如仅对/api/*路径处理令牌),那么/metrics请求会被跳过认证,导致ctx.User为空;
  2. 即使主管道注册了UseAuthentication(),MapWhen创建的分支管道默认不会自动继承后续的认证/授权逻辑,且predicate的执行时机早于分支内的中间件处理,若认证逻辑依赖分支内的配置,也会出现User未初始化的情况。

具体解决方案

方案1:确保认证中间件覆盖/metrics路径

检查你的Azure AD Bearer认证配置,移除或调整路径过滤逻辑,让认证中间件处理/metrics请求:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.Events = new JwtBearerEvents
        {
            OnMessageReceived = context =>
            {
                // 移除仅处理/api路径的限制,或添加/metrics到允许列表
                var path = context.Request.Path;
                if (path.StartsWithSegments("/api") || path.StartsWithSegments("/metrics"))
                {
                    // 保留令牌提取逻辑
                }
                // 若无需过滤,直接删除此判断
                return Task.CompletedTask;
            }
        };
        // 其他Azure AD配置(Authority、Audience等)
    });

方案2:在分支管道中显式添加认证与授权逻辑

推荐这种方式,更符合ASP.NET Core的中间件设计规范:

  1. 先注册针对指标访问的授权策略(可选,可添加客户端ID等额外校验):
services.AddAuthorization(options =>
{
    options.AddPolicy("MetricsAccess", policy =>
    {
        policy.RequireAuthenticatedUser();
        // 可选:限制仅特定Prometheus客户端ID访问
        policy.RequireClaim("azp", "your-prometheus-client-id");
    });
});
  1. 配置Prometheus端点时,在分支管道中添加认证和授权中间件:
app.UseAuthentication();
app.UseAuthorization();

app.UseOpenTelemetryPrometheusScrapingEndpoint(
    configureEndpoint: endpoint =>
    {
        // 在分支管道中显式添加认证与授权
        endpoint.UseAuthentication();
        endpoint.UseAuthorization();
        // 应用授权策略
        endpoint.RequireAuthorization("MetricsAccess");
    });

app.MapControllers();

这种方式会先在分支内完成认证流程,只有通过授权的请求才能获取指标,避免在predicate中提前判断认证状态的问题。

方案3:在predicate中手动触发认证(不推荐,仅兼容旧逻辑)

如果必须保留predicate判断的方式,可手动触发认证流程:

app.UseOpenTelemetryPrometheusScrapingEndpoint(
    predicate: async ctx =>
    {
        // 手动触发Bearer认证,指定认证方案确保正确性
        var authResult = await ctx.AuthenticateAsync(JwtBearerDefaults.AuthenticationScheme);
        return authResult.Succeeded;
    });

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 19:10:59