使用HttpSendRequest强制进行基本身份验证?

6
使用InternetSetOption来设置连接到REST服务时的用户名密码。我注意到当我首先调用InternetSetOption时,WinInet在调用HttpSentRequest时不发送Authorization头。这似乎很荒谬,因为您必须先从服务器获取带有WWW-Authenication头的响应。这会在每个请求上向服务器创建一个额外的请求。

是否有WinInet调用可以在第一次调用时强制使用Authorization头,还是我必须手动添加它?


你尝试过直接添加身份验证标头吗? - kiewic
1
我最终直接添加了身份验证标头,但这似乎是一个临时的解决方案。如果您已经知道身份验证方案,为什么WinInet不允许您指定它呢? - bpeikes
我来这里是为了找到同样的谜题答案,只是我在InternetConnect中指定了凭据,而不是使用InternetSetOption。但是两个都没有像预期的那样起作用。 - Enno
2个回答

1
经过一番思考和研究,我认为答案是否定的。要设置一个授权头部,WinInet需要知道它应该使用什么身份验证方法,而不仅仅是用户名和密码。确定身份验证方案的标准方式是发送一个未经身份验证的请求并读取WWW-Authenticate头部。
如果你知道你的请求需要基本身份验证,你可以自己设置Authorization:头部,使用HttpAddRequestHeaders函数:
   HttpAddRequestHeaders(hRequest, TEXT("Authentication: Basic dXNlcjpwYXNzd29yZA=="), -1, HTTP_ADDREQ_FLAG_REPLACE);

使用CryptBinaryToString计算您自己的"user:password"字符串的base64编码。

0
在使用HttpSendRequestW之前调用InternetSetOptionW函数。例如:
InternetSetOptionW( hRequest, INTERNET_OPTION_USERNAME, (void*) pwszAuthUserName, wcslen( pwszAuthUserName ) + 1 );
InternetSetOptionW( hRequest, INTERNET_OPTION_PASSWORD, (void*) pwszAuthPassword, wcslen( pwszAuthPassword ) + 1 );
HttpSendRequestW( hRequest, 0, -1, 0, 0 );

1
OP说他已经在使用InternetSetOption,尽管他没有展示他的代码。我也尝试了同样的方法,但仍然遇到了同样的问题:HttpSendRequest发送了一个没有认证的初始请求,紧接着是一个带有认证的请求。 - Enno

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