集成 Windows 身份验证 Wininet

Posted

技术标签:

【中文标题】集成 Windows 身份验证 Wininet【英文标题】:Integrated Windows Authentication Wininet 【发布时间】:2011-04-28 19:53:58 【问题描述】:

各位专家 我需要使用 wininet API 从 C++ 应用程序发送一个 http 请求。 用户位于配置为使用集成 Windows 身份验证的 ISA 代理服务器后面。 当我收到错误 407(需要代理身份验证)时,我使用 InternetErrorDlg 向用户询问凭据。这不是一个理想的解决方案,因为 IE 能够透明地使用当前用户的凭据。有没有办法做到这一点?

请求示例代码

hRequest = HttpOpenRequest ( 
    hConnect, 
    "POST", 
    query.c_str(), 
    HTTP_VERSION, 
    NULL, 
    cAcceptTypes, 
    INTERNET_FLAG_RELOAD | INTERNET_FLAG_NO_CACHE_WRITE| INTERNET_FLAG_KEEP_CONNECTION,
    0);

bRet = HttpSendRequest(
                hRequest,
                NULL,
                0,
                (LPVOID)dataXml.c_str(),
                (DWORD)dataXml.length());

bRet = HttpQueryInfo(
                hRequest,
                HTTP_QUERY_FLAG_NUMBER | HTTP_QUERY_STATUS_CODE,
                &dwStatus,
                &dwSize,
                NULL);


if (dwStatus == HTTP_STATUS_PROXY_AUTH_REQ)


    ProxyAuthenticate( hRequest );  // Here I call InternetErrorDlg
            bRet = HttpSendRequest(
                hRequest,
                NULL,
                0,
                (LPVOID)dataXml.c_str(),
                (DWORD)dataXml.length());

【问题讨论】:

您能否展示一些示例代码,WinInet 通常会使用本地凭据自动处理身份验证,除非您已使用 InternetSetOption 明确禁用身份验证。 【参考方案1】:

尝试使用INTERNET_OPEN_TYPE_PRECONFIG在你的进程中初始化Wininet:

InternetOpen(clientName, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);

【讨论】:

hSession = InternetOpen ("ddd", INTERNET_OPEN_TYPE_PRECONFIG, NULL, 0, 0);

以上是关于集成 Windows 身份验证 Wininet的主要内容,如果未能解决你的问题,请参考以下文章

使用 WinInet 的客户端身份验证(证书 + 私钥)

如何使用 wininet.dll 对代理进行身份验证?

Windows 集成 (NTLM) 身份验证与 Windows 集成 (Kerberos)

使用集成 Windows 身份验证接收登录提示

SignalR 不适用于 Windows 集成身份验证

node.js 客户端中的 Windows 集成身份验证