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

Authentication 如何仅为ASP.NET 5(ASP.NET核心)中的受保护操作添加令牌验证,authentication,oauth,asp.net-core,jwt,openid-connect,Authentication,Oauth,Asp.net Core,Jwt,Openid Connect,我已将JWT中间件添加到我的应用程序中: app.UseJwtBearerAuthentication(options => { options.AutomaticAuthenticate = true;} ) 现在,如果我的令牌没有进行验证(例如,过期),我仍然会收到一个错误,即生命周期验证没有通过。有没有办法让中间件只对受保护的资源验证令牌?如果没有,那么我应该如何以及在哪里调用中间件自己所做的事情(将令牌读入HttpContext.User) 注意:我是这样添加保护的: servi

我已将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() {
    ...
}

我不太明白这会有什么帮助。。。我已经有了一个过滤器,可以为所有[Authorize]属性添加RequireAuthenticatedUser,但问题不是我可以访问受保护的资源,而是相反:我不能访问公共资源(当令牌过期时),因为无论资源是否受保护,jwt令牌验证似乎在任何情况下都会发生。。。我将在问题中添加更多的代码配置授权策略是启用手动身份验证(Katana中称为被动身份验证)的推荐方法。当然,您需要关闭AutomaticAuthenticate,以防止自动调用JWT承载中间件(我认为这很明显,但我会更新我的答案以提及它)。好的,谢谢,我会尝试。但我不太明白在这种情况下,如果关闭自动身份验证,是什么触发了令牌的解析?另一个问题是,这种方法是否可以与筛选器一起使用,即AllowAnonymous是否会覆盖授权策略以跳过检查?在这种情况下,身份验证将由MVC的授权筛选器触发(在应用授权规则之前)。在全局级别定义AuthorizeFilter不会有帮助,因为它仍然会为所有MVC操作触发有缺陷的JWT中间件,即使您使用AloowAnonymous来装饰它们:那么我为什么需要JWT中间件呢?或者唯一的原因是它将注册将由authorize属性进一步使用的承载方案?如果我理解正确,那么在默认情况下,没有办法使用过滤器完全保护所有API,并且只允许对某些API进行匿名访问(我想唯一的办法是根本不从客户端为已知API发送令牌)