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

Posted

技术标签:

【中文标题】如何仅为 ASP.NET 5 (ASP.NET Core) 中的受保护操作添加令牌验证【英文标题】:How to add token validation only for protected actions in ASP.NET 5 (ASP.NET Core) 【发布时间】:2016-05-01 22:25:50 【问题描述】:

我已将 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 应该确实存在)。

【问题讨论】:

【参考方案1】:

首先,您需要通过在 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() 
    ...

【讨论】:

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

以上是关于如何仅为 ASP.NET 5 (ASP.NET Core) 中的受保护操作添加令牌验证的主要内容,如果未能解决你的问题,请参考以下文章

IIS 7.5、ASP.NET、模拟和访问 C:\Windows\Temp

[目录] ASP.Net Core 微服务搭建网站

如何创建 Web 服务 | ASP.NET 2.0 | C# |网页服务

在 ASP .NET 5 中如何保护配置数据?

如何终止会话或会话 ID (ASP.NET/C#)

如何确定在 C# ASP.NET CORE MVC 5.0 中选择了哪个单选按钮