【问题标题】:How to conditionally require authentication in .Net Core Web API如何在 .Net Core Web API 中有条件地要求身份验证
【发布时间】:2020-12-09 03:28:47
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: security asp.net-core authentication asp.net-core-webapi asp.net-core-3.1


    【解决方案1】:

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

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

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

    【讨论】:

    • 我已经完全按照您的指示设置了我的代码。我非常沮丧,因为如果不符合策略,使用[Authorize(Policy = "PolicyName")] 会阻止调用,但返回的状态码是 200(OK)。我已经尝试了所有我能想到的将代码更改为其他内容的方法,但无论我在哪里更改它,它总是返回 200。
    • 如果我不提供任何一个 JWT,那么我将得到一个 401(由正常的身份验证代码设置)。但如果我只提供其中一个,我将无法获得 401。 (我曾尝试调用 Challenge,然后在 JWT 的 OnChallenge 事件中将 Status 设置为 401,我尝试将其设置为自定义属性,并且我已将其设置在自定义中间件中。无论我在哪里将其设置为 401,我总是把 200 送回去。)
    • 当两个 JWT 都需要时,您究竟是如何在浏览器中传递它们的?根据 RFC,您不能在 Auth 标头中传递多个不记名令牌,那么您是否使用自己的自定义标头 (X-*) 将令牌传递给您的服务器?如果是这样,那么标准的 .Net 不记名令牌设置当然不起作用。
    猜你喜欢
    • 2020-10-15
    • 2017-04-27
    • 2017-09-05
    • 2020-09-05
    • 2019-10-22
    • 2020-11-15
    • 2016-12-22
    • 2019-05-11
    • 1970-01-01
    相关资源
    最近更新 更多