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

时间:2020-02-26 13:20:22

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

我正在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);

当我尝试与Postman进行完全相同的简单呼叫时,它会返回一个清晰的status200代码。

postman version

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

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分: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);

但是我觉得很奇怪,很难找到它!