具有JWT身份验证的HttpWebRequest始终以未经授权的401响应

问题描述 投票:0回答:2

我正在ASP.NET Core 3.1中开发一个Web服务,该服务使用JWT身份验证和授权来确保安全。我已经使用Postman和Javascript(axios)对其进行了测试,并且一切似乎都很好。但是现在我必须更新.NET 4.6.2应用程序才能访问此Web服务,但是无论如何它总是以状态码401“未授权”响应,而我只是不明白为什么。

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

            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);

[当我尝试使用邮递员的完全相同的简单呼叫时,它会返回一个干净的status200代码。

postman version

有人知道我在做什么错吗?

.net authentication jwt httpwebrequest http-status-code-401
2个回答
0
投票

在邮递员中,您将发送具有键值授权的常规标头键值对,该值是Bearer令牌。但是,在您的代码中,您将其作为授权标头发送。

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

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


0
投票

嗯,所以问题是由服务器代码引起的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);

但是对我来说很难找到它很奇怪!

© www.soinside.com 2019 - 2024. All rights reserved.