2012-06-20 12 views
22

Ich versuche auf eine Webseite auf der gleichen Domäne/asp.net Anwendung zuzugreifen, die passwortgeschützt ist. Die Anmeldeinformationen sind für die Webseite, die diesen Aufruf auslöst, und für die Webseite, auf die zugegriffen wird, identisch.WebClient Zugriff auf Seite mit Anmeldeinformationen

Hier ist der Code, und ich weiß nicht, warum ich immer mit einem Login-Formular HTML-Code?

using (WebClient client = new WebClient()) 
{ 
    client.QueryString.Add("ID", "1040"); //add parameters 
    //client.Credentials = CredentialCache.DefaultCredentials; 
    //I tried to add credentials like this 
    client.Credentials = new NetworkCredential("username", "password"); 

    string htmlCode = client.DownloadString("http://domain.loc/testpage.aspx"); 
} 
+0

Warum leiten Sie nicht einfach auf diese Seite um? Wenn Sie es mit Code im Serverprozess herunterladen, bedeutet dies, dass Sie * nicht dieselben Anmeldeinformationen verwenden. Wenn ich richtig verstehe, dass der Browser (mit den Anmeldeinformationen des Clients) auf die Seite zugreift, lädt ein anderer Prozess auf einem anderen Computer (dem Server) es herunter und präsentiert es dem Client! – shambulator

+0

Wie werden diese Zugangsdaten für die Webseite bereitgestellt? Wird die Formularauthentifizierung verwendet? –

+0

@shambulator Was meinst du mit Weiterleitung zu dieser Seite? Ich versuche, HTML-Code dieser Seite zu bekommen. – mko

Antwort

48

Ich vermute, dass die Webseite, auf die Sie zugreifen möchten, die Formularauthentifizierung verwendet. Dies bedeutet, dass Sie einen gültigen Authentifizierungscookie angeben müssen, wenn Sie auf geschützte Ressourcen zugreifen möchten. Um ein gültiges Authentifizierungs-Cookie zu erhalten, müssen Sie sich zunächst authentifizieren, indem Sie eine POST-Anfrage an die LogOn-Seite senden, die den Cookie ausgibt. Sobald Sie das Cookie abgerufen haben, können Sie es bei nachfolgenden Anfragen an geschützte Ressourcen senden. Sie sollten außerdem bemerken, dass WebClient keine Cookies unterstützt. Aus diesem Grund könnten Sie eine benutzerdefinierte Cookie bewusst Webclient schreiben:

public class CookieAwareWebClient : WebClient 
{ 
    public CookieAwareWebClient() 
    { 
     CookieContainer = new CookieContainer(); 
    } 
    public CookieContainer CookieContainer { get; private set; } 

    protected override WebRequest GetWebRequest(Uri address) 
    { 
     var request = (HttpWebRequest)base.GetWebRequest(address); 
     request.CookieContainer = CookieContainer; 
     return request; 
    } 
} 

Nun könnte man diesen Client verwenden, um die 2-Anfragen abzufeuern:

using (var client = new CookieAwareWebClient()) 
{ 
    var values = new NameValueCollection 
    { 
     { "username", "john" }, 
     { "password", "secret" }, 
    }; 
    client.UploadValues("http://domain.loc/logon.aspx", values); 

    // If the previous call succeeded we now have a valid authentication cookie 
    // so we could download the protected page 
    string result = client.DownloadString("http://domain.loc/testpage.aspx"); 
} 

Offensichtlich aufgrund der Viewstate crapiness von ASP.NET Sie müssen möglicherweise einige andere Parameter entlang Ihrer Anmeldeanforderung senden. Das können Sie tun: Authentifizieren Sie sich in einem Webbrowser und schauen Sie mit FireBug die genauen Parameter und Header an, die gesendet werden müssen.

+0

Lösung sieht nett und sauber aus. Sollten die Namen für die Login-Sammlung wirklich Benutzername und Passwort sein? Und gibt es eine andere Möglichkeit für die Anwendung, aktuelle Anmeldeinformationen zu verwenden, trotz der Tatsache, dass es sich um formularbasierte Authentifizierung handelt? – mko

+0

@John, ich weiß nicht, ob die Namen für die Anmeldung Benutzername und Passwort sein sollten. Das hängt vollständig davon ab, wie Ihre Anmeldeseite implementiert ist und welche Parameter sie erwartet. Und nein, es gibt keinen anderen Weg. Sie benötigen ein gültiges Formularauthentifizierungs-Cookie, und die einzige Möglichkeit, ein solches Cookie zu erhalten, besteht darin, der Anmeldeseite korrekte Anmeldeinformationen bereitzustellen. Es ist nur diese Seite (hoffentlich :-)), die Cookies zur Formularauthentifizierung ausgibt. –

+0

Code funktioniert nicht, aber ich verstehe die Idee, und ich werde versuchen, es zum Laufen zu bringen. – mko