【问题标题】:HttpWebRequest with JWT authentication always responds with 401 unauthorized带有 JWT 身份验证的 HttpWebRequest 始终以未经授权的 401 响应
【发布时间】:2023-03-21 07:16:02
【问题描述】:

我正在 ASP.NET Core 3.1 中开发一个使用 JWT 身份验证和授权来确保安全的 Web 服务。我一直在使用 Postman 和 Javascript (axios) 对其进行测试,一切似乎都很好。 但是现在我必须更新一个 .NET 4.6.2 应用程序才能访问这个 web 服务,但不知何故,它总是以状态码 401 'unauthorized' 进行响应,我就是不明白为什么。

最简单的客户端版本如下图:

            var request = WebRequest.CreateHttp(@"http://localhost:49767/Information/TestAuthentication");
            request.Headers.Add(HttpRequestHeader.Authorization, "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwcm9kdWN0IjpbIjBuR29nVU40amtLd1pVb0xiK2pvMUE9PSIsIjZ0dmFWMHpWU0VLZk1GMDhqL2diRUE9PSJdLCJzdWIiOiJhMWQxNDI2OC1iZmMzLTRiM2EtOGNkNS04NDUyNzhjNWNiMzciLCJleHAiOjE1ODMzMTgwMTcsImlzcyI6IlRlc3QuY29tIiwiYXVkIjoiVGVzdC5jb20ifQ.132BrlZidEUDEBIGK_nNr7Dw50pFyTl15jMGuRwbsts");

            request.Method = "GET";


            HttpWebResponse response = (HttpWebResponse)request.GetResponse();

            if (response.StatusCode != HttpStatusCode.OK)
                throw new Exception(response.StatusDescription);

当我尝试来自 Postman 的完全相同的简单调用时,它会返回一个干净的 status200 代码。

有谁知道我做错了什么??

【问题讨论】:

    标签: .net authentication jwt httpwebrequest http-status-code-401


    【解决方案1】:

    在 Postman 中,您发送的是带有键值 Authorization 的常规标头键值对,其值是 Bearer 令牌。但是,在您的代码中,您将其作为 Authorization 标头发送。

    尝试将其作为带有键值对的常规标头发送,如下所示: request.Headers.Add("Authorization", "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwcm9kdWN0IjpbIjBuR29nVU40amtLd1pVb0xiK2pvMUE9PSIsIjZ0dmFWMHpWU0VLZk1GMDhqL2diRUE9PSJdLCJzdWIiOiJhMWQxNDI2OC1iZmMzLTRiM2EtOGNkNS04NDUyNzhjNWNiMzciLCJleHAiOjE1ODMzMTgwMTcsImlzcyI6IlRlc3QuY29tIiwiYXVkIjoiVGVzdC5jb20ifQ.132BrlZidEUDEBIGK_nNr7Dw50pFyTl15jMGuRwbsts");

    如果您想通过 Authorization 标头发送,您也可以尝试 request.Headers[HttpRequestHeader.Authorization] = "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwcm9kdWN0IjpbIjBuR29nVU40amtLd1pVb0xiK2pvMUE9PSIsIjZ0dmFWMHpWU0VLZk1GMDhqL2diRUE9PSJdLCJzdWIiOiJhMWQxNDI2OC1iZmMzLTRiM2EtOGNkNS04NDUyNzhjNWNiMzciLCJleHAiOjE1ODMzMTgwMTcsImlzcyI6IlRlc3QuY29tIiwiYXVkIjoiVGVzdC5jb20ifQ.132BrlZidEUDEBIGK_nNr7Dw50pFyTl15jMGuRwbsts";

    【讨论】:

    • 这不是...我发现当我在服务器上禁用 HTTPS 重定向时我的问题似乎消失了。这不是解决问题的方法,但我现在有了一些新想法。
    【解决方案2】:

    嗯,所以问题是由服务器代码引起的 app.UseHttpsRedirection();

    显然 https 重定向清除了“授权”标头

    我可以通过使用来自简单匿名请求的 uri 来获得一个正常运行的应用程序。

    var request = WebRequest.CreateHttp(@"http://localhost:49767/Information");
    var response = request.GetResponse() as HttpWebResponse;
    
    var uri = new Uri(response.ResponseUri, "/Information/TestAuthentication");
    request = WebRequest.CreateHttp(uri);
    

    但我觉得这很难找到!

    【讨论】:

      猜你喜欢
      • 2021-02-16
      • 2021-07-17
      • 2018-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多