使用 HTTP Web 请求发送 HTTP 标头以进行 NTLM 身份验证

Posted

技术标签:

【中文标题】使用 HTTP Web 请求发送 HTTP 标头以进行 NTLM 身份验证【英文标题】:Sending HTTP Headers with HTTP Web Request for NTLM Authentication 【发布时间】:2010-12-03 23:46:33 【问题描述】:

我想登录一个 Sharepoint 门户,该门户会显示一个登录对话框,但使用的是 NTLM 身份验证。如何修改 C# 中的 HTTP 标头以发出成功的登录请求?我假设我需要向门户登录部分中的页面发出 HTTPWebRequest 并在此旁边发布 HTTP 标头集合?

【问题讨论】:

【参考方案1】:

为了对 WebRequest 使用 NTLM 身份验证,凭据信息应存储在 CredentialCache

var request = (HttpWebRequest)WebRequest.Create(url);
// INIT REQUEST HERE ...

var credential = new NetworkCredential(username, password, domain);
var credentialCache = new CredentialCache();
credentialCache.Add(new Uri(url), "NTLM", credential);
request.Credentials = credentialCache;

// SEND ...

来源:http://predicatet.blogspot.com/2007/01/httpwebrequest-networkcredential-with.html

【讨论】:

【参考方案2】:

要使用 NTLM,请参阅John's 答案。如果您需要跨会话的标头,请查看 HttpWebRequest 对象上的 CookieContainer 属性。您需要保留对 CookieContainer 的引用,并将其附加到您创建的任何其他 HttpWebRequest。

【讨论】:

【参考方案3】:

您可以使用 WebRequest 类来做到这一点。

WebRequest req = WebRequest.Create(tokenUri);
req.AuthenticationLevel = System.Net.Security.AuthenticationLevel.MutualAuthRequested;
req.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;
WebResponse resp = req.GetResponse();
StreamReader reader = new StreamReader(resp.GetResponseStream());
var token = reader.ReadToEnd().Trim();

此代码将整个响应读入名为token 的变量中。

【讨论】:

尝试这个时我得到The remote server returned an error: (401) Unauthorized。相同的 URL/用户/密码适用于 Firefox。 HTTP 上的 NTLM

以上是关于使用 HTTP Web 请求发送 HTTP 标头以进行 NTLM 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

发送带有 http 标头的 curl 请求

如何防止 angular.js $http 对象发送 X-Requested-With 标头?

使用 AngularJS 发送 HTTP 标头请求

$http post 请求未添加指定的标头

使用 OPTIONS 方法未使用 http 请求 Angular 6 发送授权标头

在 HTTP-Request 中使用 JWT 发送授权标头