我在我的应用程序中添加了一个JWT中间件:
app.UseJwtBearerAuthentication(options => { options.AutomaticAuthenticate = true;} )
现在如果我的令牌没有验证(例如已过期),我仍然会收到生命周期验证未通过的错误.有没有办法让中间件仅为受保护资源验证令牌?如果没有,那么我应该如何以及在哪里调用自己的中间件(将令牌读入HttpContext.User)?
P.S这是我添加保护的方式:
services.AddMvc(config => { var policy = new AuthorizationPolicyBuilder() .RequireAuthenticatedUser() .Build(); config.Filters.Add(new AuthorizeFilter(policy)); });
这就是我允许公共访问的方式:
[HttpGet] [AllowAnonymous] public string Get(int id) { }
澄清:如果没有令牌,这将有效,但如果令牌无效(例如已过期),即使公共资源也无法访问,并且将抛出500(由于某些内部错误导致401应该真的存在).
解决方法
首先,您需要通过在JWT承载选项中将AutomaticAuthentication设置为false来禁用自动身份验证.
要确保为特定操作调用JWT承载中间件,您可以使用AddAuthenticationSchemes创建自己的授权策略:
public void ConfigureServices(IServiceCollection services) { services.AddAuthorization(options => { options.AddPolicy("API",policy => { policy.AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme); policy.RequireAuthenticatedUser(); }); }); }
然后,使用Authorize属性修饰控制器操作:
[Authorize(Policy = "API")] [HttpGet("your-action")] public IActionResult Action() { ... }