我根据Måns Tånneryd的回答做了一些额外的研究。以及他在评论中发布的链接:PreAuthenticate Property of WebRequest - Problem。
首先,如他的链接中所述,HttpWebRequest.PreAuthenticate 属性不发送 Authentication 标头 PRE 身份验证,而是在身份验证之后在后续请求中预发送它。来自 MSDN:
true 在身份验证发生后发送带有请求的 HTTP Authorization 标头;否则为假。默认值为假。
因此,即使将PreAuthenticate
属性设置为 true,在任何事情发生之前,我们仍然需要一个带有 401 Unauthorized 的 WWW-Authenticate 质询。现在,如果我们尝试使用以下代码对 github 进行身份验证:
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 中看到以下内容:
并且响应将具有预期的结果。