我在我的应用程序中添加了一个JWT中间件:
<li>
现在,如果我的令牌未验证(例如已过期),我仍然会收到生命周期验证未通过的错误。有没有办法让中间件仅为受保护资源验证令牌?如果没有,那么我应该如何以及在哪里调用中间件自己(将令牌读入HttpContext.User)?
P.S这是我添加保护的方式:
<li class="lifecycle-state taskpanel-select-option" role="presentation" tabindex= "0">
<a href="#" role="menuitem">
<span data-bind="text: StateName"/>
<span class="lifecycle-stateId" data-bind="text: StateId"/>
</a>
</li>
这就是我允许公众访问的方式:
app.UseJwtBearerAuthentication(options => { options.AutomaticAuthenticate = true;} )
澄清:如果没有令牌,这将有效,但如果令牌无效(例如已过期),即使公共资源将无法访问,也会抛出500(由于某些内部错误导致401应该真的存在)。
答案 0 :(得分:3)
首先,您需要通过在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() {
...
}