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

F# ASP.NET Core+Fable项目JWT认证失败:Bearer未通过验证

排查JWT认证401问题的核心方向

1. Token生成与验证参数不匹配

服务端生成Token和认证中间件的密钥、算法、Issuer、Audience必须完全一致,包括大小写和特殊字符。检查F#中AddJwtBearer的配置:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(fun options ->
        options.TokenValidationParameters <- TokenValidationParameters(
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true,
            ValidateIssuerSigningKey = true,
            ValidIssuer = "your-issuer",
            ValidAudience = "your-audience",
            IssuerSigningKey = SymmetricSecurityKey(Encoding.UTF8.GetBytes("your-secret-key"))
        )
    )

要确认生成Token时使用的参数和上述配置完全一致,比如算法不能一边用HmacSha256一边用HmacSha512。

2. Token携带格式错误

客户端请求的Authorization头必须严格遵循Bearer <token>格式,注意Bearer后有空格。检查Fable中Fetch请求的头写法:

fetch "/api/protected" {
    headers = [
        HttpRequestHeaders.Authorization ("Bearer " + token)
    ]
    // 其他请求配置
}

用浏览器开发者工具Network面板验证请求头,确认没有拼写错误(比如写成小写bearer)或遗漏空格。

3. Token已过期或无效

  • 检查生成Token时的Expires设置是否过短,用本地解码工具查看exp时间戳,对比当前时间确认是否过期。
  • 确认生成Token时的ClaimsIdentity没有遗漏必要声明,或声明格式不符合验证要求。

4. 中间件顺序错误

ASP.NET Core中间件顺序决定执行逻辑,认证中间件必须放在路由中间件之前:

app.UseAuthentication()
app.UseAuthorization()
app.UseRouting()
app.UseEndpoints(fun endpoints ->
    endpoints.MapControllers() |> ignore
)

如果UseAuthentication()在UseRouting()之后,认证逻辑无法提前触发,会直接返回401。

5. 接口授权配置不匹配

检查需要认证的接口是否正确标记[<Authorize>]特性,若指定了认证方案,需和服务端配置一致:

[<ApiController>]
[<Route("api/[controller]")>]
type ProtectedController() =
    inherit ControllerBase()
    
    [<HttpGet>]
    [<Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)>]
    member this.Get() =
        Ok "Authenticated content"

若接口授权方案与服务端认证方案不匹配,会导致认证失败。

6. Token内容被篡改或格式损坏

客户端获取的Token必须是完整的三段式JWT字符串(header.payload.signature),若传输/存储时被截断、添加多余字符(换行、空格),服务端无法解析。可在本地用代码验证:

let handler = JwtSecurityTokenHandler()
let validationParams = TokenValidationParameters(...) // 与服务端一致的参数
try
    let mutable validatedToken : SecurityToken = null
    handler.ValidateToken(token, validationParams, &validatedToken)
    printfn "Token valid"
with
| ex -> printfn "Token invalid: %s" ex.Message

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 06:35:10