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

