如何仅为 ASP.NET 5(ASP.NET 核心)中的受保护操作添加令牌验证



我已经在我的应用程序中添加了一个 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() {
    ...
}

最新更新