【问题标题】:.NET Core Web API, JWT and Swagger - 401 is showing as Undocumented instead of Unauthorized.NET Core Web API、JWT 和 Swagger - 401 显示为未记录而不是未授权
【发布时间】:2021-03-26 21:45:26
【问题描述】:

我有一个 ASP.NET Core Web API 3 应用程序,它实现了 REST API 并使用 JWT 不记名令牌进行授权,以及 Swagger (Swashbuckle)。

我的控制器上有 [Authorize] 过滤器,例如:

[ApiController]
[Route("api/[controller]")]
[Authorize]
public class MyController : ControllerBase
{
}

Swagger 与我的 API 配合使用,我可以生成 JWT 令牌并提供给 Swagger,一切正常。

但是,如果我尝试使用 Swagger 在没有 JWT 令牌或无效 JWT 令牌的情况下访问我的 REST 端点之一,Swagger UI 将显示错误 401 未记录,但我看到的所有示例在网络上显示我应该得到 401 Unauthorized

(当我使用 Postman 访问相同的 URL 时,它确实显示 401 Unauthorized。)

在我开始扯掉一些东西之前,有什么想法为什么我可能会得到无证而不是未经授权?

这是我看到的:

当我添加下面建议的属性时

 (ProducesResponseType(typeof(ProblemDetails), (int)HttpStatusCode.Unauthorized)])

我看到了:

【问题讨论】:

  • 看起来它的工作方式与预期完全一致...如果您对项目有任何疑问,请在此处报告:github.com/swagger-api/swagger-ui/issues/new/choose
  • 你解决了这个问题吗?我现在有同样的问题
  • @HelderSepulveda 工作正常,是的,但在 Details 列中,Error: 应该显示“未授权”。这是 JoeD 报告的缺失行为的图像:link
  • 我也有同样的问题。在我的一个 API 中,它只打印“错误:”,就像您的一样,在另一个 API 中,它打印“错误:未经授权”。我希望他们都打印“错误:未经授权”。我有 operation.Responses.Add("401", new OpenApiResponse { Description = "Unauthorized" });在 IOperationFilter 但更改或删除描述无济于事。

标签: asp.net-core jwt swagger asp.net-core-webapi swashbuckle


【解决方案1】:

您可以在 Startup.cs 中添加 app.UseStatusCodePages()。

这将返回一个响应正文

【讨论】:

    【解决方案2】:

    请您在操作方法中尝试以下属性,

     [ProducesResponseType(typeof(ProblemDetails), (int)HttpStatusCode.Unauthorized)] 
    

    【讨论】:

    • 当我添加它时,我仍然在服务器响应下得到上述 401,但是在响应下,我看到 401 Unauthorized。如果没有该属性,我会在服务器响应下得到 401 Undocumented,在响应下得到 200 Success。我将在我的原始帖子中添加屏幕截图。我还用 Postman 和原始代码进行了测试,它确实显示 401 Unauthorized。不是 Swagger/Swashbuckle 页面。
    【解决方案3】:

    也许已经晚了,但我遇到了这个问题,所以知道我回答了。

    它显示未记录,因为您的授权标头的起点中不存在 bearer 关键字。可能你的标题是这样的:

    Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJNb3N0YWZhOTEiLCJqdGkiOiIzNGEzNjQwNC1iZWNjLTRhMmMtOGJkZi01ZDc1ZTBiY2QwZGIiLCJJZCI6IjEiLCJleHAiOjE2MTAyNDcyMTUsImlzcyI6Im1vaGFtYWRyYXZhZWkuaW5mbyIsImF1ZCI6Im1vaGFtYWRyYXZhZWkuaW5mbyJ9.0_kKI7F12o62A_QUZ38U9KVbBpnQMyO7kGcqBZzU4AU
    

    所以你应该把它改成:

    Authorization: 
    **Bearer** eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJNb3N0YWZhOTEiLCJqdGkiOiIzNGEzNjQwNC1iZWNjLTRhMmMtOGJkZi01ZDc1ZTBiY2QwZGIiLCJJZCI6IjEiLCJleHAiOjE2MTAyNDcyMTUsImlzcyI6Im1vaGFtYWRyYXZhZWkuaW5mbyIsImF1ZCI6Im1vaGFtYWRyYXZhZWkuaW5mbyJ9.0_kKI7F12o62A_QUZ38U9KVbBpnQMyO7kGcqBZzU4AU
    

    实际上邮递员在Token的第一个设置了bearer,如果你设置了Bearer但Token已被弃用,那么状态码将显示Unauthorized code。

    【讨论】:

    • 我正面临@JoeD 报告的问题。我无法按照您的指示进行操作,您指的是“授权标头的起点”吗?我在 .Net 5 上,一切正常,只是 Swagger 上的那个小东西。谢谢!
    • @cecAR 您是否在请求标头中的 Token 之前添加了 Bearer?
    • 现在我明白你的意思了。验证没有问题,那部分工作正常(甚至不需要添加 bearer 字)。问题是,当您未通过身份验证时。界面必须在详细信息框中显示“错误:未授权”。在这里,我给你一张图片来解释缺少的东西:link
    猜你喜欢
    • 2020-02-11
    • 2020-03-28
    • 1970-01-01
    • 2020-03-04
    • 1970-01-01
    • 2019-06-05
    • 2018-01-09
    • 2018-06-06
    • 2021-09-21
    相关资源
    最近更新 更多