【发布时间】: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 表示一切正常,客户端需要解析正文。相反,将状态码设置为4xx 和
context.HttpContext.Response.StatusCode = 401。
标签: c# asp.net-core asp.net-core-webapi http-status-codes