【问题标题】:Handle Unauthorized Request and Return Status Code 404处理未经授权的请求并返回状态码 404
【发布时间】:2019-01-24 15:11:25
【问题描述】:

我正在开发一个独立的 .Net Core API 目标框架 .Net Core 2.2。
身份验证方案是连接到我们的 ADFS 识别服务器的 JWTBearerTokens。
当我调用使用 [Authorize] 属性修饰的 API 端点时,我收到 401 Unauthorized 响应,这是预期的默认行为。

我接下来要做的不是让相同的调用返回 401,而是将状态码返回为 404。(我不想详细说明为什么 404。简单地说,我不想如果请求中未包含有效令牌,则表明端点存在)

在之前的 .Net Framework WebAPI 中,您可以创建自己的属性并覆盖 HandleUnauthorizedRequest 方法并返回您想要的状态代码。

我已经查看了有关基于策略的授权的文档,但没有尝试过该示例或尝试实施它。如果策略未执行,策略处理程序看起来更多地与处理(返回成功或失败)有关。我看不到任何地方可以在失败时返回不同的状态代码。因此,只有当我开始检查实际政策时,这才有意义。

有什么见解吗?

【问题讨论】:

  • 这是毫无意义的尝试。无论如何,任何人都知道端点存在的唯一方法是它是否以某种方式记录在案。没有办法“浏览” API。必须在某处列出一些端点或文档,以便客户端知道端点存在。假设他们知道它存在,那么返回 404 只会使您的文档看起来像是错误的。更糟糕的是,它现在无法真正向客户提供有用的信息,即他们没有提供授权,从而阻止了仅仅犯了错误的有效客户知道如何纠正他们的错误。
  • 401状态的存在是有原因的:让客户知道他们需要提供授权。
  • 讨论为什么 404 不是真正的问题。只是想了解如何返回不同的状态代码。您的观点绝对有效,但也有一些内部政策和限制我也受到限制。
  • 我的意思是,没有真正的好方法可以做你想做的事,因为这不是一开始就应该做的事情。你也许可以一起破解一些东西,虽然我不确定那会是什么样子,但反击更容易更好。作为开发人员,你的工作不是盲目地做任何事情。如果经理类型等知道事情是如何运作的,他们就不需要你了。而且,只是说某事是不可能的总是一种选择,即使现实是只有通过黑客才能实现。
  • 请提及您的编程语言以获得更好的答案

标签: asp.net-core-webapi asp.net-core-2.2


【解决方案1】:

返回 404 而不是 401 是不好的做法(正如 @Chris Pratt 在 cmets 中提到的那样),必须避免。考虑这些情况,

  1. 您将项目留给其他人,他们不知道为什么返回 404
  2. 调用主页/索引页面时返回 404。意识形态差。
  3. 稍后在项目中,您决定允许发布请求而无需身份验证。以此类推。

无论如何,作为社区的一员,我会给你答案...

将此添加到您的 global.asax

void Application_EndRequest(object source, System.EventArgs args)
{
    if (Response.StatusCode == 401)
    {
        Response.ClearContent();
        Response.RedirectToRoute("ErrorH", (RouteTable.Routes["ErrorH"] as Route).Defaults);
    }
}

在 routeConfig 中,为你的 errorHandler 创建一个路由:

routes.MapRoute(
    "ErrorH",
    "Error/{action}/{errMsg}",
    new { controller = "CustomController", action = "Change401To404", errMsg = UrlParameter.Optional }
);

在您的自定义控制器中:

public class CustomController : Controller //or Base
{
    public ActionResult Change401To404(){
         //Do whatever you want
    }
}

PS:这不是唯一的方法,还有很多其他方法可以做到。但至少在这种方法中,您可以区分真正的 404 响应和 401 响应。

【讨论】:

    猜你喜欢
    • 2016-06-22
    • 2013-12-30
    • 2021-04-26
    • 2014-07-08
    • 1970-01-01
    • 2020-10-10
    • 2017-10-16
    • 1970-01-01
    • 2013-01-01
    相关资源
    最近更新 更多