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

.Net5对接MongoDB Identity时HttpContext.User.Identity.Name为空如何解决

问题排查与修复方案

1. 修复认证方案冲突与冗余配置

你当前代码同时注册了Cookie和JWT两套认证逻辑,且存在重复配置错误:

  • 首先删除冗余的Cookie认证注册代码,你是前后端分离的JWT认证场景,不需要Cookie认证:
// 删掉这行冗余代码
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie();
  • 修复ConfigureJwtAuthorization方法内重复调用AddAuthorizationCore的错误:
public static void ConfigureJwtAuthorization(this IServiceCollection services)
{
    services.AddAuthorizationCore(auth =>
    {
        auth.AddPolicy("BearerNegotiateNTLM", new AuthorizationPolicyBuilder()
            .AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme)
            .RequireAuthenticatedUser().Build());
    });
}

2. 显式指定JWT的名称声明映射

HttpContext.User.Identity.Name为空的核心原因是JWT验证时没有指定对应的名称声明类型,需要在TokenValidationParameters中添加NameClaimType配置:

options.TokenValidationParameters = new TokenValidationParameters()
{
    ValidateIssuer = true,
    ValidateAudience = true,
    RequireExpirationTime = true,
    IssuerSigningKey = JwtTokenDefinitions.IssuerSigningKey,
    ValidAudience = JwtTokenDefinitions.Audience,
    ValidIssuer = JwtTokenDefinitions.Issuer,
    ValidateIssuerSigningKey = JwtTokenDefinitions.ValidateIssuerSigningKey,
    ValidateLifetime = JwtTokenDefinitions.ValidateLifetime,
    ClockSkew = JwtTokenDefinitions.ClockSkew,
    // 新增这行,指定用户名对应的声明类型
    NameClaimType = ClaimTypes.Name
};

3. 修复IIS启动配置错误

你的launchSettings.json中关闭了匿名认证、开启了Windows认证,会导致登录接口的[AllowAnonymous]失效,请求未到业务逻辑就被IIS拦截要求Windows认证,修改配置如下:

"iisSettings": {
  "windowsAuthentication": false,
  "anonymousAuthentication": true,
  "iisExpress": {
    "applicationUrl": "http://localhost:57064",
    "sslPort": 44393
  }
}

4. 注册IHttpContextAccessor服务

如果你没有手动注册IHttpContextAccessor,需要在服务注册逻辑中添加:

services.AddHttpContextAccessor();

5. 移除冗余的Cookie登录逻辑

_signInManager.PasswordSignInAsync是Cookie认证的登录逻辑,你使用JWT认证不需要调用该方法,直接用_userManager.CheckPasswordAsync验证账号密码即可:

// 替换原来的PasswordSignInAsync逻辑
var appUser = await _userManager.FindByNameAsync(model.UserName);
if (appUser != null && await _userManager.CheckPasswordAsync(appUser, model.Password))
{
    // 原有生成JWT返回的逻辑
}

验证步骤

修复后请求接口时,需要在请求头中携带Authorization: Bearer {你的AccessToken},再调用_httpContextAccessor.HttpContext.User.Identity.Name即可正常获取用户名。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 11:18:04