我在使用 WinHTTP 进行 NTLM 身份验证时遇到了一些问题。在监视wireshark 中的流量时,我可以看到正在发出的请求,但客户端从不发送必要的身份验证标头,因此每次服务器以401 身份验证要求消息进行响应时。
我不在任何与主机直接 IP 连接的代理服务器后面,所以这应该不是问题。
这是我的代码:非常感谢您的帮助。
hSession = WinHttpOpen(L"Connection/1.0",
WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0);
hConnect = WinHttpConnect(hSession, L"connect", INTERNET_DEFAULT_HTTP_PORT, 0);
hRequest = WinHttpOpenRequest(hConnect, L"GET", url, NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, NULL);
WinHttpSetOption (hRequest, WINHTTP_OPTION_AUTOLOGON_POLICY, 0, 0);
int i = 0;
while(!bDone)
{
i++;
WinHttpSetCredentials(hRequest, WINHTTP_AUTH_TARGET_SERVER, WINHTTP_AUTH_SCHEME_NTLM, NULL, NULL, NULL);
//Send the request
bResults = WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0);
//End the request
if(bResults)
bResults = WinHttpReceiveResponse(hRequest, NULL);
if( bResults )
bResults = WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER, NULL, &dwStatusCode, &dwSize, NULL );
if(bResults)
{
switch(dwStatusCode)
{
case 401:
//Requres auth
newFile << "401 Auth Required\n";
WinHttpSetCredentials(hRequest, WINHTTP_AUTH_TARGET_SERVER, WINHTTP_AUTH_SCHEME_NTLM, NULL, NULL, NULL);
break;
default:
newFile << dwStatusCode << " unknown\n";
break;
}
}
if(i >= 30)
bDone = TRUE;
}