web-dev-qa-db-fra.com

Page d'accès WebClient avec informations d'identification

J'essaie d'accéder à une page Web sur un même domaine/même application asp.net, qui est protégé par mot de passe. Les informations d'identification sont les mêmes pour la page Web qui déclenche cet appel et la page Web consultée.

Voici le code, et je ne sais pas pourquoi je me retrouve toujours avec un code html de formulaire de connexion?

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");
}
24
mko

Je soupçonne que la page Web à laquelle vous essayez d'accéder utilise l'authentification par formulaire. Cela signifie que vous devrez fournir un cookie d'authentification valide si vous souhaitez pouvoir accéder aux ressources protégées. Et pour obtenir un cookie d'authentification valide, vous devrez d'abord vous authentifier en envoyant une demande POST à la page LogOn qui émet le cookie. Une fois le cookie récupéré, vous pourrez envoyer le long des demandes ultérieures sur les ressources protégées. Vous devez également noter que WebClient ne prend pas en charge les cookies. Pour cette raison, vous pouvez écrire un client Web personnalisé compatible avec les cookies:

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

Vous pouvez maintenant utiliser ce client pour lancer les 2 requêtes:

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

De toute évidence, en raison de l'incroyable ViewState d'ASP.NET, vous devrez peut-être envoyer quelques autres paramètres le long de votre demande de connexion. Voici ce que vous pourriez faire: authentifiez-vous dans un navigateur Web et regardez avec FireBug les paramètres et les en-têtes exacts qui doivent être envoyés.

52
Darin Dimitrov