我已经在我的应用程序中添加了一个 JWT 中间件:
app.UseJwtBearerAuthentication(options => { options.AutomaticAuthenticate = true;} )
现在,如果我的令牌未验证(例如过期),我仍然会收到一个错误,指出生命周期验证未通过。有没有办法让中间件只验证受保护资源的令牌?如果不是,那么我应该如何以及在哪里调用自己做的中间件(将令牌读取到 HttpContext.User 中)?
附言这是我添加保护的方式:
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 持有者选项中将自动身份验证设置为 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() {
...
}