我已将 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 应该确实存在)。
首先,您需要通过设置禁用自动身份验证自动认证 to false在您的 JWT 承载选项中。
为了确保调用 JWT 承载中间件来执行特定操作,您可以使用以下命令创建自己的授权策略添加身份验证方案:
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() {
...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)