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

Force Basic Authentication with HttpSendRequest?

本文关键字:身份验证 HttpSendRequest      更新时间:2023-10-16

使用 InternetSetOption 设置连接到REST服务时的usernamepassword。我注意到当我调用HttpSentRequest时,即使我先调用了InternetSetOption,WinInet也不会发送授权标头。您必须先使用WWW-Authenication标头从服务器获得响应似乎很荒谬。这会在每个请求上向服务器创建一个完整的额外请求。

是否有WinInet调用在第一次调用时强制授权标头,或者我是否必须手动添加它?

在 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 );

经过一番深思熟虑和研究,我认为答案是否定的。若要设置授权标头,WinInet 需要知道它应该使用哪种身份验证方法,而不仅仅是什么用户名和密码。确定身份验证方案的标准方法是发送未经身份验证的请求并读取 WWW-Authenticate 标头。

如果您知道您的请求需要基本身份验证,则可以使用 HttpAddRequestHeaders 自行设置 Authorization: 标头:

   HttpAddRequestHeaders(hRequest, TEXT("Authentication: Basic dXNlcjpwYXNzd29yZA=="), -1, HTTP_ADDREQ_FLAG_REPLACE);

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