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
相关产品推荐
相关产品推荐

