L527695021 2023-03-26 16:43 采纳率: 0%
浏览 22

.Net6 WebApi JWT鉴权

JWT 鉴权的问题,一直返回401 Console.Write();打印出来为invalid_token,但是我验证这个Token好像是没问题的,然而我通过swagger测试不行,
麻烦大手子们看下是我哪里配置有问题吗
下面贴代码

/// 
        ///  获取 Token
        /// 
        /// <param name="userName">用户名</param>
        /// <param name="password">密码</param>
        /// <returns></returns>
        public string GetToken(string userName, string password)
        {
            #region 有效载荷
            var claims = new[] {
                 new Claim(ClaimTypes.Name, userName),
                 new Claim("NickName",userName),
                 new Claim(ClaimTypes.Role,"Administrator"),
                 new Claim("Role","Assient"),
             };
            #endregion

            SymmetricSecurityKey key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_option.CurrentValue.SecurityKey!));
            SigningCredentials signingCredentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
            JwtSecurityToken token = new JwtSecurityToken(
                issuer: _option.CurrentValue.Issuer!,
                 audience: _option.CurrentValue.Audience!,
                 claims: claims,
                 expires: DateTime.Now.AddMinutes(60),
                 notBefore: DateTime.Now,
                 signingCredentials: signingCredentials);

            string returnToken = new JwtSecurityTokenHandler().WriteToken(token);

            return returnToken;
        }

#region JWT配置鉴权
JWTTokenOption tokenOption = new JWTTokenOption();
builder.Configuration.Bind("JWTTokenOption", tokenOption);

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(option =>
{
    option.TokenValidationParameters = new TokenValidationParameters()
    {
        ValidateIssuer = true,
        ValidateAudience = true,
        ValidateLifetime = true,
        ValidateIssuerSigningKey = true,
        ValidAudience = tokenOption.Audience,
        ValidIssuer = tokenOption.Issuer,
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(tokenOption.SecurityKey!))
    };

    option.Events = new JwtBearerEvents
    {
        //此处为权限验证失败后触发的事件
        OnChallenge = context =>
        {
            Console.Write(context.Error);
            context.HandleResponse();

            //自定义自己想要返回的数据结果
            var payload = "{\"Success\":false,\"Msg\":\"很抱歉,您无权访问该接口\",\"StatusCode\":401}";
            context.Response.ContentType = "application/json";
            context.Response.StatusCode = 200;
            //输出Json数据结果
            context.Response.WriteAsync(payload);
            return Task.FromResult(0);
        }
    };
});
#endregion

//以上信息都是读取的appsettin的数据,调试都是有值的
"JWTTokenOption": {
    "Audience": "22333",
    "Issuer": "22333",
    "SecurityKey": "12333456677655ffrrffff"
  }
  • 写回答

1条回答 默认 最新

  • xia0xin 2023-03-28 00:15
    关注

    您的代码看起来基本没问题,但有几个可能的原因需要检查:

    您是否已经将 JWT 添加到了应用程序的管道中?在您的 Configure 方法中,应添加以下行:

    app.UseAuthentication();

    您是否已经在请求的头部中设置了 Authorization?确保在调用受保护的 API 时,您已经在请求头部中设置了带有 JWT 的 Authorization。例如,您的请求头部可能如下所示:

    Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

    如果您正在使用 Swagger 进行测试,确保您已正确配置了 Swagger。在您的 ConfigureServices 方法中,应包含以下行:

    services.AddSwaggerGen(c =>
    {
    c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });
    // Add JWT Authentication to swagger
    c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
    {
    Description = "JWT Authorization header using the Bearer scheme. Example: "Authorization: Bearer {token}"",
    Name = "Authorization",
    In = ParameterLocation.Header,
    Type = SecuritySchemeType.Http,
    Scheme = "bearer"
    });
    c.AddSecurityRequirement(new OpenApiSecurityRequirement
    {
    {
    new OpenApiSecurityScheme
    {
    Reference = new OpenApiReference
    {
    Type = ReferenceType.SecurityScheme,
    Id = "Bearer"
    }
    },
    new string[] { }
    }
    });
    });

    如果您使用的是 IdentityServer4 来保护您的 API,您需要检查授权服务器是否正确配置并正在运行。在这种情况下,您的 ConfigureServices 方法可能看起来像这样:

    services.AddAuthentication("Bearer")
    .AddIdentityServerAuthentication(options =>
    {
    options.Authority = "https://my-identity-server.com";
    options.RequireHttpsMetadata = true;
    options.ApiName = "my-api";
    });

    如果这些都没有解决您的问题,请检查您的请求头,确保您正在使用正确的 JWT。如果您的代码仍然无法工作,请提供更多信息,例如您正在使用的框架和技术,以及您的请求头和响应详细信息。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月26日

悬赏问题

  • ¥15 HLs设计手写数字识别程序编译通不过
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 TYPCE母转母,插入认方向
  • ¥15 如何用python向钉钉机器人发送可以放大的图片?
  • ¥15 matlab(相关搜索:紧聚焦)
  • ¥15 基于51单片机的厨房煤气泄露检测报警系统设计
  • ¥15 Arduino无法同时连接多个hx711模块,如何解决?
  • ¥50 需求一个up主付费课程
  • ¥20 模型在y分布之外的数据上预测能力不好如何解决