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

ASP.NET Core 6 MVC中JWT Token调用API返回登录页问题求助

问题排查与解决方案

核心原因:默认认证方案冲突

AddDefaultIdentity会自动注册Cookie认证方案并将其设为默认,当API请求未通过授权时,系统会触发Cookie认证的默认行为——重定向到登录页面,而非返回401 Unauthorized。


解决方案步骤

1. 明确设置JWT Bearer为默认认证方案

修改Program.cs中的认证配置,将JWT Bearer设为默认的认证和挑战方案:

builder.Services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(o =>
{
    o.TokenValidationParameters = tokenValidationParameters;
});

如果需要同时支持Cookie(用于MVC页面登录)和JWT(用于API),可以保留Cookie认证,但在API控制器/Action上明确指定认证方案:

[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
public IActionResult MyProtectedApi()
{
    // ...
}

2. 修复Token中的角色Claims缺失问题

你的登录代码中获取了用户角色,但未将其添加到JWT的Claims中,导致基于角色的授权策略(如RequireAdmin)无法生效。修改Login方法:

var roles = await _userManager.GetRolesAsync(user);
var claims = new List<Claim>
{
    new Claim(JwtRegisteredClaimNames.Sub, user.UserName),
    new Claim("Id", user.Id),
    new Claim(JwtRegisteredClaimNames.UniqueName, user.UserName),
    new Claim(_options.ClaimsIdentity.UserIdClaimType, user.Id.ToString()),
    new Claim(_options.ClaimsIdentity.UserNameClaimType, user.UserName)
};
// 添加角色Claims到Token
foreach (var role in roles)
{
    claims.Add(new Claim(ClaimTypes.Role, role));
}

var tokenDescriptor = new SecurityTokenDescriptor
{
    Subject = new ClaimsIdentity(claims),
    Expires = DateTime.UtcNow.AddDays(7),
    Issuer = _config["Jwt:Issuer"],
    Audience = _config["Jwt:Issuer"],
    SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
};

3. 验证请求头格式

确保请求头的Authorization格式正确:

Authorization: Bearer <你的AccessToken>

注意Bearer与Token之间必须有空格,且Token无多余的换行或空格。

4. 确认API授权配置

  • 确保需要保护的API控制器/Action上添加了[Authorize]属性;
  • 如果使用自定义授权策略(如EmployeeOnly),需确保Token中包含对应的Claim(如EmployeeNumber)。

5. 检查JWT配置一致性

确认appsettings.json中的Jwt:Key和Jwt:Issuer在登录代码与Program.cs中完全一致,且Jwt:Key长度至少为16字节(HmacSha256算法要求)。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 11:03:18