使用客户端凭据的SSL上的HttpWebRequest

5

我正在尝试使用HttpWebRequest获取需要用户名和密码的https URI。如果我将URI放入浏览器中,它会弹出一个对话框要求凭据,然后工作。使用HttpWebRequest会给我返回401未经授权的错误。

NetworkCredentials的文档表示不支持SSL,但我找不到应该使用什么。

1个回答

6

服务器使用的是HTTP基本身份验证还是其他类型的验证?如果使用HTTP基本身份验证,则可以将Web请求的Credentials属性设置为包含正确用户名和密码的凭据,并将PreAuthenticate属性设置为true。

以下是一个示例(未经测试,仅供参考):

var uri = new Uri("https://somesite.com/something");
var request = WebRequest.Create(uri) as HttpWebRequest;
request.Credentials = new NetworkCredential("myUserName","myPassword");
request.PreAuthenticate = true;

var response = request.GetResponse();

注意:根据我的经验,在.NET框架中会出现一些奇怪的行为。你可能认为它应该按照代码的意思去做,但实际上它会这样做:
  • 发送没有凭证的请求到服务器
  • 服务器响应401
  • 使用你提供的凭证重新发送请求
  • 服务器接受请求。
我不知道为什么会这样,因为它看起来有点出问题,所以也许这是我机器的一个怪癖,也许不会发生在你身上。
如果你的应用程序对性能不那么敏感,并且你的请求不是大量数据的POST请求,你可能不会注意到,但为了避免这种情况,我不得不手动构建HTTP基本身份验证头并通过操作Headers集合手动设置它到HttpWebRequest中。

我相信您所描述的行为与*nix中的wget显示的行为相同。它尝试一次失败,然后发送凭据并成功。 - Stephan
我认为这是HTTP规范的一部分,一种挑战-请求序列。 - MGOwen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接