处理未经授权的请求和返回状态码404

时间:2019-01-24 15:11:26

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

我正在开发一个独立的.Net Core API目标框架.Net Core 2.2。
身份验证方案是JWTBearerTokens,它连接到我们的ADFS Identify服务器。
当我调用装饰有[Authorize]属性的API终端时,我收到401未经授权的响应,这是预期的和默认的行为。

我接下来要做的是,不是让同一个调用返回401,而是将状态代码返回为404。(我不想深入探讨404原因的原因。简单地说,我不想如果请求中未包含有效令牌,则表明端点存在)

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

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

有什么见解吗?

1 个答案:

答案 0 :(得分:0)

返回404而不是401是不好的做法(如@Chris Pratt的评论中所述),必须避免。考虑这些情况,

  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响应区分开。