如何使用HttpWebRequest.Credentials属性进行基本身份validation?

如何使用Webrequest Credentials属性发送基本身份validation标头? 即使PreAuthenticate设置为true,为什么Authorization标头不会随请求一起发送?

 WebRequest request = (HttpWebRequest)WebRequest.Create("https://api.github.com/user"); request.Credentials = new NetworkCredential("githubUsername", "githubPassword"); request.PreAuthenticate = true; var response = request.GetResponse(); 

服务器应发送包含 WWW-Authenticate HTTP标头的HTTP 401 Not Authorized响应代码。

 WWW-Authenticate: Basic realm="example" 

PreAuthenticate属性仅在进行身份validation后才有效。 来自MSDN:

如果在进行身份validation后发送带有请求的HTTP Authorization标头,则为true;否则为true。 否则,是的。 默认值为false。

有关详细信息,请参阅其他答案。

我根据MånsTånneryd的回答做了一些额外的研究。 他在评论中发表的链接: WebRequest的PreAuthenticate属性 – 问题 。

首先,如他的链接中所述, HttpWebRequest.PreAuthenticate属性不会发送身份validation标头PRE身份validation,但会在身份validation之后将其发送到以下请求中。 来自MSDN:

如果在进行身份validation后发送带有请求的HTTP Authorization标头,则为true;否则为true。 否则,是的。 默认值为false。

因此,即使将PreAuthenticate属性设置为true,我们仍然需要在发生任何事情之前使用401 Unauthorized进行WWW-Authenticate挑战。 现在,如果我们尝试使用以下代码对github进行身份validation:

 WebRequest request = (HttpWebRequest)WebRequest.Create("https://api.github.com/user"); request.Credentials = new NetworkCredential("githubUsername", "githubPassword"); var response = request.GetResponse(); 

将抛出WebException ,因为我们没有获得WWW-Authenticate质询。 如果我们在Fiddler捕获这个,我们将获得以下内容:

在此处输入图像描述

但是,如果我们尝试使用完全相同的代码,针对确实返回WWW-Authenticate挑战的网站,我们将在Fiddler中看到以下内容:

在此处输入图像描述在此处输入图像描述

响应将得到预期的结果。

我可以成功运行此代码访问另一台同时需要SSL和身份validation的服务器。 这个服务器与github的不同之处在于github返回一个json结果,表示它需要身份validation,另一个服务器返回一个“经典”401 html页面。 嗅探网络,您可以看到.net代码尝试进行匿名身份validation,即使您将preauth设置为true,我认为这是相当混乱的。 但是,在收到常规的401页后,它再次尝试,这次使用身份validation信息,一切正常。 在我看来,虽然.net在收到401的json版本时反应不同,而不是第二次尝试。

我想这不是你正在寻找的答案,但希望它能更清楚地了解情况。