仅在从代码(c#)调用时返回未授权(401)

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

UPDATE

正如@AlexandruClonţea建议的那样,我检查了小提琴日志,发现:

在成功或失败的情况下,实际上发送了2个请求。对于这两种情况,第一个请求大多是相同的,它类似于:

    GET http://myservice.com/handler?param1=something&param2=somethingelse HTTP/1.1
    Authorization: Basic xxxxxx
    Accept: application/json, application/xml, text/json, text/x-json, 
    text/javascript, text/xml
    User-Agent: RestSharp/100.0.0.0
    Host: myservice.com
    Accept-Encoding: gzip, deflate
    Connection: Keep-Alive

它们的响应是相同的,即:

    HTTP/1.1 301 Moved Permanently
    Content-Type: text/html; charset=utf-8
    Location: /handler/?param1=something&param2=somethingelse
    Date: Sat, 08 Sep 2018 01:50:16 GMT
    Content-Length: 115

    <a href="/handler/?param1=something&param2=somethingelse">Moved Permanently</a>.

我注意到它总是尝试将调用重定向到/ handler /?param1 = something&param2 = somethingelse,这是因为服务器代码的设置。它实际上按预期工作。区别在于第二个请求。失败案例的第二个请求(即c#代码)没有授权标头,这就是失败的原因。现在,我的问题是,为什么第二个请求会错过授权标题?我该如何解决?以下是失败请求的示例:

GET http://myservice.com/handler/?param1=something&param2=somethingelse HTTP/1.1
Accept: application/json, application/xml, text/json, text/x-json, 
text/javascript, text/xml
User-Agent: RestSharp/100.0.0.0
Accept-Encoding: gzip, deflate
Host: myservice.com

背景:我在服务器上部署了一个用GO编写的服务。它需要基本身份验证。例如,我可以使用以下请求成功调用它:

GET /handler/? 
param1=something&param2=somethingelse HTTP/1.1
> Host: myservice.com
> Authorization: Basic xxxxxx
> User-Agent: RestClient/5.16.6
> Accept: */*

上面的请求是由rest api客户端工具(如邮递员)完成的,并且工作正常。如果我从浏览器调用它,它也可以正常工作。

问题:现在,我尝试使用c#代码对同一服务进行相同的调用,我将其作为:

// pass cert validation
ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

HttpClient client = new HttpClient();
var byteArray = Encoding.ASCII.GetBytes(username + ":" + password);
var auth = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, url);
request.Headers.Authorization = auth;

var response = client.SendAsync(request).Result; // don't need async

但在这种情况下,我得到了未经授权(401)的回复。我检查了代码发送的实际请求,它与上面显示的授权标题完全相同(授权:基本xxxxxx,xxxxxx与上面相同)和uri相同。实际上,它发送的所有内容与我使用其余的api客户端工具时的内容相同,但它在代码中失败了。

当我检查服务器端的日志时,我在返回401时看到下面的日志:

[GIN-debug]重定向请求301:/ handler - > / handler /?param1 = something&param2 =其他

但是当来自其他api客户端工具(或浏览器)的呼叫时,我看不到这个日志

您可能从日志中了解到,服务器端代码正在使用go gin框架。但由于它在其他情况下工作正常,我不认为这是服务器端代码的问题。

回到C#代码,我试图使用HttpWebRequest和NetworkCredential而不是HttpClient,我也尝试使用client.DefaultRequestHeaders.Authorization = auth,但我仍然得到同样的错误。

我想知道是否有人之前见过这个或者可以提供帮助?真的很感激。

c# authentication dotnet-httpclient http-status-code-401 go-gin
1个回答
0
投票

作为一种解决方法,我可以将请求修改为http://myservice.com/handler/?param1=something&param2=somethingelse,这样就不需要重定向。因此,它将被正确授权。

但是,还没有弄清楚如何使用authorize标头发送第二个请求。

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