ASP.NET Core 8默认Identity令牌认证失效:404错误求助
问题原因
- 默认认证/挑战方案未指定为Bearer:当前配置仅添加了Bearer令牌支持,但未将其设置为默认认证和挑战方案,Identity默认使用Cookie认证逻辑,未认证时会触发重定向到登录页面的行为。
- 令牌生成方式错误:
GenerateUserTokenAsync生成的是用于密码重置、邮箱验证等场景的一次性用途令牌,并非Bearer认证所需的标准访问令牌,无法被Bearer认证中间件识别验证。 - 令牌存储逻辑不符合Bearer认证要求:手动存储的令牌未关联到Bearer认证的令牌类型,Bearer中间件无法从请求中验证该令牌的有效性。
解决方案
1. 配置默认认证与挑战方案
修改Program.cs中的认证配置,明确将Bearer设置为默认方案:
builder.Services.AddAuthentication(options => { options.DefaultAuthenticateScheme = IdentityConstants.BearerScheme; options.DefaultChallengeScheme = IdentityConstants.BearerScheme; }) .AddBearerToken(IdentityConstants.BearerScheme);
2. 使用Identity的Bearer令牌生成方法
替换服务中的令牌生成逻辑,使用.NET 8+新增的GenerateUserBearerTokenAsync方法生成标准Bearer访问令牌:
public async Task<TokenDto> GenerateAndStoreTokenAsync(string username) { if (string.IsNullOrEmpty(username)) return null; var user = await _userManager.FindByNameAsync(username); if (user == null) return null; // 生成符合Bearer标准的访问令牌 var tokenResult = await _userManager.GenerateUserBearerTokenAsync(user, IdentityConstants.BearerScheme); return new TokenDto { Token = tokenResult.Token }; }
说明:
GenerateUserBearerTokenAsync会自动处理令牌的签名、有效期、用户声明等信息,无需手动存储,令牌本身包含所有验证所需数据,由Bearer中间件自动解析验证。
3. 确保请求携带正确的Bearer令牌
调用授权API时,必须在请求头中添加Authorization: Bearer {token},示例请求:
GET /api/xxx/securedata Headers: Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
4. 移除不必要的中间件(可选)
API应用无需静态文件支持,可移除UseStaticFiles中间件,避免潜在的流程干扰:
// app.UseStaticFiles(); // 删除此行
验证步骤
- 重新启动应用,调用Login/Register接口获取新的Bearer令牌;
- 携带令牌调用
/securedata接口,确认返回200 OK及用户信息; - 移除令牌或使用无效令牌调用接口,确认返回401 Unauthorized而非404。
内容的提问来源于stack exchange,提问作者user2618875
相关产品推荐
相关产品推荐

