REST API身份验证:带cookie的摘要类型(c#)

时间:2016-02-15 14:38:06

标签: c# rest authentication cookies fiddler

我有一个服务REST API,我试图连接。 使用浏览器一切正常。

但是在c#中我总是有未经授权的回答。

我使用fiddler调查了这个问题,并发现在第一个不成功的reuest服务器返回一些cookie,浏览器在下一个会话中使用它与用户名/密码(摘要类型)。在这种情况下第二个会话成功。

但是当我尝试使用c#发送请求时(我尝试使用System.Net.WebClient和HttpWebRequest)我没有得到响应(我在一段时间后有超时异常)。

我的代码:

WebClient webClient = new WebClient(); 
CredentialCache cache = new CredentialCache();
Uri prefix = new Uri(Url);
cache.Add(prefix, "Digest", new NetworkCredential(login, password));
webClient.Credentials = cache;
...

string response = webClient.DownloadString(restRequest);

最后一行抛出异常。

当我在Fiddler调查此问题时,我发现在第一个状态为401的会话中,我们收到了cookie(如下图所示)。 fiddler's picture 浏览器在下一个请求中发送此cookie并成功进行身份验证。 但是在c#中我无法用状态401来表示这个响应。正如我在fiddler工作室看到的那样,尝试在每个下一个秒内打开新的会话10-20次,然后才会抛出超时异常。我的回答是null。

此外,我还有其他不需要cookie的环境,我的代码正在运行。

请给我一个建议锄头以获得状态401的响应并从中获取cookie以将其设置为另一个请求。

感谢 麦克

1 个答案:

答案 0 :(得分:0)

我使用带有定义的空(非空)CookieContainer的HttpWebRequest解决了这个问题。

我的代码:

HttpWebRequest request1;
HttpWebResponse response1 = null;
String responseBody;
request1 = (HttpWebRequest) WebRequest.Create(requestString);
request1.Credentials = cache;

request1.CookieContainer = new CookieContainer();            

response1 = (HttpWebResponse) request1.GetResponse();
using (StreamReader stream = new StreamReader(response1.GetResponseStream(), Encoding.UTF8))
    {
        responseBody = stream.ReadToEnd();
    }

在具有状态401的第一个会话之后的此实现中,请求将cookie从第一个会话提供给下一个会话,并返回状态代码200 OK。