WebClient类的域凭据不起作用

agn*_*zka 26 .net

我正试图通过C#代码获取网站的html源代码.当我使用Windows身份验证访问该站点时,以下代码有效:

using (WebClient client = new WebClient())
            {
                client.Credentials = CredentialCache.DefaultCredentials;
                using (Stream stream = client.OpenRead("http://intranet/"))
                using (StreamReader reader = new StreamReader(stream))
                {
                    MessageBox.Show(reader.ReadToEnd());
                }
            }
Run Code Online (Sandbox Code Playgroud)

当我手动输入我的域凭据时,我收到"未经身份验证"的消息:

using (WebClient client = new WebClient())
            {
                NetworkCredential credentials = new NetworkCredential("username", "pass", "domain");
                client.Credentials = credentials;
                using (Stream stream = client.OpenRead("http://intranet/"))
                using (StreamReader reader = new StreamReader(stream))
                {
                    MessageBox.Show(reader.ReadToEnd());
                }
            }
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

Dar*_*rov 54

试试这个:

CredentialCache cc = new CredentialCache();
cc.Add(
    new Uri("http://intranet/"), 
    "NTLM", 
    new NetworkCredential("username", "pass", "domain"));
client.Credentials = cc;
Run Code Online (Sandbox Code Playgroud)

  • 您需要指定身份验证类型.当服务器使用NTLM身份验证向客户端提出质询时,将使用`authType ="NTLM"`在WebClient.Credentials上调用ICredentials.GetCredential方法.如果你使用`WebClient.Credential = new NetworkCredential(...)`,因为没有指定认证类型,客户端将无法正确响应.`CredentialCache`已经实现了这个功能. (11认同)
  • 好的安慰,我想指出,如果你不想创建一个新的NetworkCredential,你可以从DefaultNetworkCredentials获得默认的:NetworkCredential networkCredential = CredentialCache.DefaultNetworkCredentials.GetCredential(uri,"NTLM")` (7认同)