代码之家  ›  专栏  ›  技术社区  ›  Nick Prozee Achraf C.

通过http发送基本身份验证

  •  5
  • Nick Prozee Achraf C.  · 技术社区  · 10 年前

    我试图从需要基本身份验证的页面读取源代码。然而,在HttpWebRequest中使用Header甚至Credentials,仍然会返回未授权异常[401]。

    string urlAddress = URL;
    string UserName = "MyUser";
    string Password = "MyPassword";
    
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(urlAddress);    
                if (UserName != string.Empty)
                {
                    string encoded = System.Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(UserName + ":" + Password));
                    request.Headers.Add("Authorization", "Basic " + encoded);
                    System.Net.CredentialCache credentialCache = new System.Net.CredentialCache();
                    credentialCache.Add(
                        new System.Uri(urlAddress), "Basic", new System.Net.NetworkCredential(UserName, Password)
                    );
    
                    request.Credentials = credentialCache;
    
                }
    
                HttpWebResponse response = (HttpWebResponse)request.GetResponse(); //<== Throws Exception 401
    

    Fiddler身份验证结果

    不存在代理身份验证标头。
    WWW Authenticate Header存在:基本领域=“示例”

    1 回复  |  直到 10 年前
        1
  •  4
  •   denys-vega    10 年前

    正如消息所说:

    不存在代理身份验证标头。

    然后,解决方法:

    ...
    string urlAddress = "http://www.google.com";
    string userName = "user01";
    string password = "puser01";
    string proxyServer = "127.0.0.1";
    int proxyPort = 8081;
    
    HttpWebRequest request = (HttpWebRequest) WebRequest.Create(urlAddress);
    
    if (userName != string.Empty)
    {
        request.Proxy = new WebProxy(proxyServer, proxyPort)
        {
            UseDefaultCredentials = false,
            Credentials = new NetworkCredential(userName, password)
        };
    
        string basicAuthBase64 = Convert.ToBase64String(Encoding.GetEncoding("ISO-8859-1").GetBytes(string.Format("{0}:{1}", userName, password)));
        request.Headers.Add("Proxy-Authorization", string.Format("Basic {0}", basicAuthBase64));
    }
    
    using (HttpWebResponse response = (HttpWebResponse) request.GetResponse())
    {
        var stream = response.GetResponseStream();
        if (stream != null)
        {
            //--print the stream content to Console
            using (var reader = new StreamReader(stream))
            {
                Console.WriteLine(reader.ReadToEnd());
            }
        }
    }
    ...
    

    我希望这有帮助。