【问题标题】:C# .NET Core Web API, throwing an AuthorizationException, client gets a 500. How do I make it return a 401 instead?C# .NET Core Web API,抛出 AuthorizationException,客户端得到 500。如何让它返回 401?
【发布时间】:2021-12-03 22:01:14
【问题描述】:

在我的 .NET Core Web API 中,我有一个在他们 AD/Okta 登录到应用程序后被调用的方法。然后某些基于数据的用户测试失败(没有存储在 ad 或 okta 中的东西,比如这个用户不是学生),我扔了一个AuthorizationException,表明这个人不允许登录。

客户端收到 500 错误,有没有好的方法让它返回未经授权的 401?

我正在使用全局异常过滤器,作为其他用途,这似乎是一个不错的选择。

public void OnActionExecuted(ActionExecutedContext context)
{
    if (context.Exception is ApiErrorException ex)
    {
        var bdo = new BaseReturnDataObject(ex.Message, ex.Type);

        context.Result = new JsonResult( bdo ) { };
        context.ExceptionHandled = true;
    }
    // do it about here 
}

除了我只能访问响应,而不是上下文对象上的请求。

我的问题是客户端会将调用特定 API 方法的 500 视为“您未获得授权”,并且无法将其与“您的服务已损坏”区分开来,因为这是第一种方法在每次登录时调用。

我有点记得在 SO 上读过一篇关于有人这样做的帖子,因为它冒犯了他们,返回类型是 500 而不是 401,这是一个坏主意,但我在搜索时找不到它它。是否有充分的理由不更改错误类型?

如果我不更改返回类型,是否有一种好方法可以将 exception.message 嵌入发送给客户端的 500 结果中,以便区分 500 的原因?

我想我要问的是在客户端区分两种类型的错误的最佳做法是什么?返回 401 看起来像是正确的答案。

编辑:我想我在这里问的是什么是最佳实践,为什么在这种情况下它是最佳实践?

【问题讨论】:

  • 你的代码中有一些未处理的异常,需要调试
  • 是的,我抛出了 AuthorizationException,我该如何处理它并返回 401 而不是 500?
  • 不要抛出 AuthorizationException,导致你的代码流返回一个代表 Unauthorized 响应的结果,而不是异常
  • 那么在正文中返回一个带有特殊信息的 200?
  • 200 表示一切正常,客户端需要解析正文。相反,将状态码设置为4xxcontext.HttpContext.Response.StatusCode = 401

标签: c# asp.net-core asp.net-core-webapi http-status-codes


【解决方案1】:

您正在用自己的方法重新发明轮子。框架已经处理了这一点。使用其文档中详述的标准 Net Core 授权过程。 TLDR,不要为身份验证/授权抛出自定义异常

https://docs.microsoft.com/en-us/aspnet/core/security/authorization/simple?view=aspnetcore-6.0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 2018-10-29
    • 2016-03-15
    • 2020-05-05
    • 2018-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多