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

Giraffe F#使用JWT认证访问受保护接口返回401未授权错误寻求解决方法

问题根因与修复方案

核心问题定位

  1. 认证中间件仅在生产环境加载
    你的configureApp逻辑中,UseAuthentication认证中间件仅在非开发环境下才会注册,开发环境完全没有启用JWT认证能力,所有需要身份校验的接口自然返回401。
  2. 无效的JWT校验配置
    你在TokenValidationParameters中设置了ValidateIssuerSigningKey = false,直接关闭了JWT签名校验逻辑,同时缺少配套的授权中间件配置。
  3. 中间件顺序错误
    CORS、认证类中间件必须放在路由终结点中间件之前,你当前的配置顺序不符合ASP.NET Core中间件执行规则。

修复步骤

  1. 修正中间件配置逻辑
    调整configureApp代码,所有环境统一加载必要的公共中间件:
let configureApp (app: IApplicationBuilder) =
    let env = app.ApplicationServices.GetService<IWebHostEnvironment>()
    // 开发环境专属中间件
    if env.IsDevelopment() then
        app.UseDeveloperExceptionPage() |> ignore
    // 所有环境通用中间件,必须放在UseGiraffe之前
    app.UseCors(configureCors)
       .UseAuthentication()
       .UseAuthorization()
       |> ignore
    // 生产环境专属中间件
    if not env.IsDevelopment() then
        app.UseHttpsRedirection()
           .UseGiraffeErrorHandler(errorHandler)
           |> ignore
    // 终结点中间件放最后执行
    app.UseGiraffe(webApp)
  1. 修正JWT校验参数
    开启必要的校验项保证JWT安全性:
let configureServices (services: IServiceCollection) =
    // 删除无用的services.BuildServiceProvider()调用,避免服务重复实例化
    services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(fun options ->
            options.TokenValidationParameters <-
                TokenValidationParameters(
                    ValidateActor = false,
                    ValidateAudience = true,
                    ValidateLifetime = true,
                    ValidateIssuer = true,
                    ValidateIssuerSigningKey = true,
                    ValidIssuer = "http://localhost:5001",
                    ValidAudience = "http://localhost:5000",
                    IssuerSigningKey = SymmetricSecurityKey(Encoding.UTF8.GetBytes(Auth.secret)),
                    ClockSkew = TimeSpan.Zero
                ))|> ignore
    services.AddCors() |> ignore
    services.AddGiraffe() |> ignore
  1. 确认请求格式正确
    使用Thunder Client请求受保护接口时,必须在请求头中添加Authorization: Bearer <你的JWT令牌>,注意Bearer和令牌之间的空格不能省略。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 05:06:02