繁体   English   中英

对REST API的身份验证:摘要类型为Cookie(C#)

[英]Authentication to REST API: digest type with cookie (c#)

我尝试连接一个服务REST API。 使用浏览器都可以。

但是在C#中,我总是有未授权的答案。

我使用提琴手调查了此问题,发现在第一个失败的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(如下图所示)。 提琴手的图片浏览器在下一个请求中发送此cookie,并且身份验证成功完成。 但是在c#中,我无法接受状态为401的响应。正如我在fiddler studio中所看到的那样,尝试在引发超时异常之前的下一秒内打开新会话10-20次。 我的回应为空。

另外,我还有其他环境没有必需的Cookie,因此我的代码可以正常工作。

请给我一个建议,以获取Status 401的响应并从中获取Cookie并将其设置为另一个请求。

谢谢迈克

我使用定义为空(非空)的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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM