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

接入微软身份验证后中间件读取User始终为null但控制器可正常访问

问题原因

核心是ASP.NET Core中间件的执行顺序问题:

  • ASP.NET Core的中间件按照注册的先后顺序依次执行,微软身份验证的用户身份填充逻辑封装在 UseAuthentication 中间件中,只有该中间件执行完成后,HttpContext.User 才会被赋值为当前请求的已认证用户信息。
  • 你的自定义中间件注册在了 UseAuthentication、UseAuthorization 中间件之前,执行时身份验证逻辑还未运行,所以读取到的 User 为null。而控制器的执行是在路由匹配、认证、授权全流程完成后才触发,因此可以正常获取用户信息。
  • 你通过 IStartupFilter 注册的中间件默认会插入到整个管道的最开头,必然早于认证授权中间件,因此也无法读取到用户信息。

解决方案

调整自定义中间件的注册顺序,将其放在 UseAuthentication 和 UseAuthorization 之后,端点映射之前即可,参考注册示例:

// 基础中间件注册
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();

// 先执行认证、授权逻辑,填充User信息
app.UseAuthentication();
app.UseAuthorization();

// 再注册自定义中间件,此时已可正常读取HttpContext.User
app.UseMiddleware<CustomMiddleware>();

// 最后注册端点映射
app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

注意事项

读取用户信息前建议先判断身份认证状态,避免空引用异常:

if (httpContext.User.Identity?.IsAuthenticated == true)
{
    _logger.LogInformation("当前登录用户:{0}", httpContext.User.Identity.Name);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 09:54:01