2009-11-05 14 views
25

Próbuję uzyskać źródło HTML strony internetowej za pośrednictwem kodu C#. Kiedy uzyskać dostęp do witryny z uwierzytelniania systemu Windows następujący kod działa:Poświadczenia domeny dla klasy WebClient nie działają

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()); 
       } 
      } 

kiedy ręcznie wprowadzić swoje poświadczenia domeny pojawia się komunikat „nieuwierzytelniony”:

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()); 
       } 
      } 

Dlaczego tak jest?

Odpowiedz

52

Spróbuj tego:

CredentialCache cc = new CredentialCache(); 
cc.Add(
    new Uri("http://intranet/"), 
    "NTLM", 
    new NetworkCredential("username", "pass", "domain")); 
client.Credentials = cc; 
+2

prace, dzięki, żadnych wyjaśnień? – agnieszka

+11

Musisz określić typ uwierzytelniania. Kiedy serwer wyzywa klienta z uwierzytelnianiem NTLM, metoda ICredentials.GetCredential zostanie wywołana w WebClient.Credentials z 'authType =" NTLM "'. Jeśli użyłeś 'WebClient.Credential = new NetworkCredential (...)' ponieważ nie określono typu uwierzytelniania, klient nie będzie w stanie odpowiedzieć poprawnie. 'CredentialCache' już implementuje tę funkcjonalność. –

+1

Co powinienem podać w Uri? Zasób, który próbuję uzyskać, to "https://myDomain.com/images/userName". Czy możesz podać dowolny przykład na żywo, jak powinny wyglądać Uri i NetworkCredentials? Thx –