【问题标题】:Can't send Proxy credentials (407)无法发送代理凭据 (407)
【发布时间】:2012-07-05 11:21:50
【问题描述】:

我正在尝试编写与需要密码和用户名身份验证的代理连接的代码 C++ 程序 (ip:port:username:pw) 我得到了 http 工作,但是当我使用 https 时,我总是收到 407 错误。

如何以正确的方式在 https 上发送代理凭据? (C++)

【问题讨论】:

    标签: c++ http https proxy winhttp


    【解决方案1】:

    这很好,因为状态 407 表示代理需要身份验证。

    所以你可以使用这个:

        case 407:
                // The proxy requires authentication.
                printf( "The proxy requires authentication.  Sending credentials...\n" );
    
                // Obtain the supported and preferred schemes.
                bResults = WinHttpQueryAuthSchemes( hRequest, 
                    &dwSupportedSchemes, 
                    &dwFirstScheme, 
                    &dwTarget );
    
                // Set the credentials before resending the request.
                if( bResults )
                    dwProxyAuthScheme = ChooseAuthScheme(dwSupportedSchemes);
    
                // If the same credentials are requested twice, abort the
                // request.  For simplicity, this sample does not check 
                // for a repeated sequence of status codes.
                if( dwLastStatus == 407 )
                    bDone = TRUE;
                break;
    

    功能

        DWORD ChooseAuthScheme( DWORD dwSupportedSchemes )
      {
    //  It is the server's responsibility only to accept 
    //  authentication schemes that provide a sufficient
    //  level of security to protect the servers resources.
    //
    //  The client is also obligated only to use an authentication
    //  scheme that adequately protects its username and password.
    //
    //  Thus, this sample code does not use Basic authentication  
    //  becaus Basic authentication exposes the client's username
    //  and password to anyone monitoring the connection.
    
    if( dwSupportedSchemes & WINHTTP_AUTH_SCHEME_NEGOTIATE )
        return WINHTTP_AUTH_SCHEME_NEGOTIATE;
    else if( dwSupportedSchemes & WINHTTP_AUTH_SCHEME_NTLM )
        return WINHTTP_AUTH_SCHEME_NTLM;
    else if( dwSupportedSchemes & WINHTTP_AUTH_SCHEME_PASSPORT )
        return WINHTTP_AUTH_SCHEME_PASSPORT;
    else if( dwSupportedSchemes & WINHTTP_AUTH_SCHEME_DIGEST )
        return WINHTTP_AUTH_SCHEME_DIGEST;
    else
        return 0;
       } 
    

    这决定了身份验证方案.....然后你使用

        bResults = WinHttpSetCredentials( hRequest, 
            WINHTTP_AUTH_TARGET_SERVER, 
            dwProxyAuthScheme,
            username,
            password,
            NULL );
    

    我希望这会有所帮助...我也在使用这些工具从 azure 市场连接到 microsoft 翻译,因为它从 8 月搬到了那里,并且从 8 月开始,所有旧的 bing 翻译都不会收到请求。对我来说,它是通过标头发送身份验证密钥。但我猜你有一个用户名和密码。

    【讨论】:

    • 非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2017-08-06
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多