JWT Bearer 不断返回 401 状态 - Bearer error="invalid_token", error_description="签名无效"

Posted

技术标签:

【中文标题】JWT Bearer 不断返回 401 状态 - Bearer error="invalid_token", error_description="签名无效"【英文标题】:JWT Bearer Keeps returning 401 Status - Bearer error="invalid_token", error_description="The signature is invalid" 【发布时间】:2021-07-26 19:43:57 【问题描述】:

我在我的 Web API 中实现了 Jwt Bearer,我成功获得了登录令牌。我复制/粘贴此令牌以将其用于授权并收到

Bearer error="invalid_token", error_description="签名是 无效”

ValidIssuer 是部署在 Azure 中的 WebAPI Url

ValidAudience 是 Angular 前端 URL,也部署在 Azure 中

我花了几个小时寻找问题,但似乎没有找到解决方案。

即使将 ValidateIssuer & -Audience 设置为 false,也不能解决问题。是我遗漏了什么还是您看到了错误?

Startup.cs

        public void ConfigureServices(IServiceCollection services)
        
            services.AddCors(options =>
            
                options.AddPolicy("CorsPolicy", builder =>
                
                    builder.AllowAnyOrigin()
                    .AllowAnyHeader()
                    .AllowAnyMethod();
                );
            );
            services.ConfigureIISIntegration();

            services.ConfigureMsSqlContext(Configuration);

            services.ConfigureRepositoryWrapper();

            services.AddAuthentication(opt => 
                opt.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                opt.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
                opt.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
            )
            .AddJwtBearer(options =>
            
                options.SaveToken = true;
                options.RequireHttpsMetadata = false;
                options.TokenValidationParameters = new TokenValidationParameters
                
                    ValidateIssuer = true,
                    ValidateAudience = true,
                    ValidIssuer = Configuration["JWT:Issuer"],
                    ValidAudience = Configuration["JWT:Audience"],
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["JWT:Secret"]))
                ;
            );

            services.AddControllers();
        

        
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        
            app.UseDeveloperExceptionPage();

            app.UseHttpsRedirection();
            app.UseStaticFiles();

            app.UseCors("CorsPolicy");

            app.UseForwardedHeaders(new ForwardedHeadersOptions
            
                ForwardedHeaders = ForwardedHeaders.All
            );

            app.UseAuthentication();
            app.UseRouting();
            app.UseAuthorization();
            app.UseEndpoints(endpoints =>
            
                endpoints.MapControllers();
            );
        

【问题讨论】:

我不知道这是否有帮助,但我们这样做:Encoding.ASCII.GetBytes(options.Secret);和 ValidateIssuerSigningKey = true, 不,这没有帮助。谢谢 【参考方案1】:

解决我的问题,可能很小但有影响力的细节

我忘记将 Authorize-attribute 放在我的请求方法之上

[HttpGet, Authorize]
public IActionResult GetMaterialDetails()

【讨论】:

以上是关于JWT Bearer 不断返回 401 状态 - Bearer error="invalid_token", error_description="签名无效"的主要内容,如果未能解决你的问题,请参考以下文章

NestJs JWT 身份验证返回 401

每当我发送包含 Bearer 令牌的请求时,ASP.Net Core API 总是返回 401 未授权

护照-jwt 总是返回“未经授权” - 401

WebApi 2始终使用自定义JWT令牌返回401授权

WebApi 2 在使用自定义 JWT 令牌进行授权时总是返回 401

Nest.js Auth Guard JWT 身份验证不断返回 401 未授权