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

ASP.NET Core 6.0使用Microsoft.Identity.Web记录身份验证事件的配置问题

解决方案

你可以通过AddMicrosoftIdentityWebApi的双参数重载同时完成AzureAD配置绑定、身份验证事件订阅,无需额外手动处理配置映射:

using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.Identity.Web;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    // 第一个委托配置JwtBearer选项(包含事件订阅),第二个委托绑定AzureAd配置
    .AddMicrosoftIdentityWebApi(jwtOptions =>
        {
            // 订阅身份验证事件
            jwtOptions.Events = new JwtBearerEvents
            {
                // 身份验证失败时触发,可定位失败原因
                OnAuthenticationFailed = context =>
                {
                    // 从请求容器获取日志实例,避免提前构建服务提供器
                    var logger = context.HttpContext.RequestServices.GetRequiredService<ILogger<Program>>();
                    logger.LogError(context.Exception, "身份验证失败,请求路径:{Path},客户端IP:{Ip}", 
                        context.HttpContext.Request.Path, 
                        context.HttpContext.Connection.RemoteIpAddress?.ToString());
                    return Task.CompletedTask;
                },
                // Token验证成功时触发,用于审计正常验证请求
                OnTokenValidated = context =>
                {
                    var logger = context.HttpContext.RequestServices.GetRequiredService<ILogger<Program>>();
                    logger.LogInformation("身份验证成功,用户ID:{UserId},请求路径:{Path}",
                        context.Principal?.FindFirst("oid")?.Value,
                        context.HttpContext.Request.Path);
                    return Task.CompletedTask;
                },
                // 触发身份验证质询时触发(通常是未携带Token、Token格式错误)
                OnChallenge = context =>
                {
                    var logger = context.HttpContext.RequestServices.GetRequiredService<ILogger<Program>>();
                    logger.LogWarning("触发身份验证质询,错误:{Error},描述:{ErrorDescription}",
                        context.Error, context.ErrorDescription);
                    return Task.CompletedTask;
                },
                // 权限不足触发禁止访问时触发
                OnForbidden = context =>
                {
                    var logger = context.HttpContext.RequestServices.GetRequiredService<ILogger<Program>>();
                    logger.LogWarning("用户权限不足,无法访问路径:{Path}",
                        context.HttpContext.Request.Path);
                    return Task.CompletedTask;
                }
            };
        }, 
        msIdentityOptions => 
        {
            // 绑定AzureAd配置节,和原来直接传Configuration的效果完全一致
            builder.Configuration.GetSection("AzureAd").Bind(msIdentityOptions);
        });

// 后续其余服务注册逻辑不变
// ...

var app = builder.Build();

// 中间件配置保持原有逻辑即可,注意Authentication和Authorization中间件顺序不要乱
// ...

app.Run();
补充说明
  • 如果你需要更详细的框架内部验证日志,可以直接在appsettings.json的Logging.LogLevel节点新增配置,无需额外写代码:
{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning",
      // 调整日志级别到Debug可以看到更细的验证流程日志
      "Microsoft.Identity.Web": "Information"
    }
  }
}
  • 所有事件中可以拿到完整的HttpContext上下文信息,你可以根据审计需求补充记录请求头、请求参数、用户声明等字段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 14:24:07