如何有条件地要求.Net Core Web API中的身份验证

问题描述

.Net Core 3.1 Web API服务可以使用两种不同类型的JWT进行身份验证。

我的控制器的服务操作有时需要同时存在一个或两个。有时,任何人都可以调用它们(没有JWT)。

我可以在控制器中应用于服务操作的唯一属性Authorize属性。我已经研究过使用该属性(或自定义属性),但是遇到了问题。

似乎Authorize属性无法更改返回的HTTP状态代码。就我而言,如果在没有有效JWT的情况下调用我的服务,则需要返回401 Http状态代码

如何有条件地要求控制器中的服务操作要求身份验证并返回401?

解决方法

这有点奇怪,因为授权失败使用Authorize属性返回的默认状态码是401。它返回什么状态码?

要处理多个JWT令牌,您可能需要查看以下答案:Use multiple JWT Bearer Authentication

基本上,您将设置多个身份验证方案,并在设置中多次使用AddJwtBearer。然后,您可以创建多个Auth策略来覆盖需求的每种组合,一个仅用于第一个JWT,一个用于第二个JWT,以及一个在同时需要两个时(总共3个)的一个。然后,根据该端点的要求(一个或两个令牌),将[Authorize(Policy = "PolicyName")]属性添加到要保护的每个端点。对于不需要令牌的端点,只需将其更改为[AllowAnonymous]属性即可。