首页 > 解决方案 > C# .NET Core Web API,抛出 AuthorizationException,客户端得到 500。如何让它返回 401?

问题描述

在我的 .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 看起来像是正确的答案。

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

标签: c#asp.net-coreasp.net-core-webapihttp-status-codes

解决方案


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

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


推荐阅读