WebRequest request = HttpWebRequest.Create(url);
var credentialCache = new CredentialCache();
credentialCache.Add(
new Uri(url), // request url
"Digest", // authentication type
new NetworkCredential("user", "password") // credentials
);
request.Credentials = credentialCache;
但是,这仅适用于没有 URL 参数的 URL。例如,我可以下载 http://example.com/test/xyz.html
就好了,但是当我尝试下载 http://example.com/test?page= xyz
,结果是 400 Bad Request 消息,服务器日志中包含以下内容(运行 Apache 2.2):
Digest: uri mismatch - </test> does not match request-uri </test?page=xyz>
我的第一个想法是摘要规范要求从摘要散列中删除 URL 参数——但是从传递给 credentialCache.Add()
的 URL 中删除参数并没有改变任何事情.所以它一定是相反的,.NET 框架中的某个地方错误地从 URL 中删除了参数。
最佳答案
您说您删除了查询字符串参数,但您是否尝试过一直返回到主机?我见过的每个 CredentialsCache.Add() 示例似乎只使用主机和 CredentialsCache.Add() 的文档将 Uri 参数列为“uriPrefix”,这似乎很有说服力。
换句话说,试试这个:
Uri uri = new Uri(url);
WebRequest request = WebRequest.Create(uri);
var credentialCache = new CredentialCache();
credentialCache.Add(
new Uri(uri.GetLeftPart(UriPartial.Authority)), // request url's host
"Digest", // authentication type
new NetworkCredential("user", "password") // credentials
);
request.Credentials = credentialCache;
如果这可行,您还必须确保您不会多次向缓存添加相同的“权限”...所有对同一主机的请求都应该能够使用相同的凭据缓存条目。
关于c# - 如何使用 HttpWebRequest 进行摘要式身份验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3172510/