ASP.NET Core 2.0用JWT中间件报错:未找到‘Bearer’授权策略
嘿,我来帮你搞定这个头疼的错误!你遇到的InvalidOperationException: The AuthorizationPolicy named: 'Bearer' was not found,大概率是因为认证/授权的配置步骤缺失或者中间件顺序不对,咱们一步步排查:
1. 确认ConfigureServices里的认证服务配置是否完整
首先,你需要在ConfigureServices中正确注册JWT Bearer认证服务,并且设置好必要的验证参数。比如:
using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.IdentityModel.Tokens; using System.Text; public void ConfigureServices(IServiceCollection services) { // 先添加认证服务,指定默认认证方案为Bearer services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, // 替换成你实际的Issuer和密钥 ValidIssuer = "YourIssuerName", ValidAudience = TokenAudience, // 对应你定义的TokenAudience常量 IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("YourStrongSecretKey")) }; }); // 别忘了添加授权服务 services.AddAuthorization(); }
2. 检查Configure方法的中间件顺序
ASP.NET Core的中间件顺序非常关键,UseAuthentication()必须在UseAuthorization()之前注册,而且要放在UseMvc()之前。正确的顺序大概是这样:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } // 静态文件中间件(如果有的话) app.UseStaticFiles(); // 先启用认证 app.UseAuthentication(); // 再启用授权 app.UseAuthorization(); // 最后启用MVC app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); }
3. 检查控制器/Action上的授权属性
如果你在控制器或Action上用了[Authorize(Policy = "Bearer")],那你必须先在AddAuthorization中定义这个策略,否则就会出现找不到策略的错误。
两种解决方式:
方式一:直接使用默认认证方案
把授权属性改成[Authorize]或者[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)],这样就不需要额外定义策略了。方式二:显式定义"Bearer"授权策略
如果一定要用Policy,就在ConfigureServices的AddAuthorization里添加策略:services.AddAuthorization(options => { options.AddPolicy("Bearer", policy => { policy.AuthenticationSchemes.Add(JwtBearerDefaults.AuthenticationScheme); policy.RequireAuthenticatedUser(); }); });
最后再核对一下
检查你的Startup类,看看是不是漏掉了上面某一步——比如没注册AddAuthentication,或者中间件顺序搞反了,又或者用了[Authorize(Policy = "Bearer")]但没定义策略。
内容的提问来源于stack exchange,提问作者Conor Shannon

