c# - 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 看起来像是正确的答案。
编辑:我想我在这里问的是最佳实践是什么,为什么在这种情况下它是最佳实践?
解决方案
你正在用你的方法重新发明轮子。框架已经处理了这一点。使用其文档中详述的标准 Net Core 授权过程。TLDR,不要为身份验证/授权抛出自定义异常
https://docs.microsoft.com/en-us/aspnet/core/security/authorization/simple?view=aspnetcore-6.0
推荐阅读
- typescript - 访问 typescript 接口定义中定义的值
- javascript - 没有body-parser的express中的输入JSON在哪里?
- python - 试图围绕python函数
- javascript - 使用 create-react-app 构建开发/调试构建
- python - 如何找到 Seaborn 版本
- angular - Symfony REST API - 如何处理无效表单
- bash - 检查目录是否存在并计算与其中模式匹配的文件
- java - hamcrest 匹配器不匹配相等的问题
- rest - oauth2 的 Swashbuckle.AspNetCore 问题总是让我收到 401 的请求
- java - 来自多个类的重写方法