2012-06-20 16 views
22

Aynı etki alanında/bir web sayfasıyla aynı parolayla korunan bir web sayfasına erişmeye çalışıyorum. Kimlik bilgileri, hem bu aramayı yapan web sayfası hem de erişilmekte olan web sayfası için aynıdır.WebClient kimlik bilgilerinize erişme sayfası

İşte kod ve neden her zaman bir giriş formu html kodu ile bittiğini bilmiyorum?

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

Neden sadece bu sayfaya yönlendirmiyorsunuz? Sunucu işleminde kod kullanarak indirdiğinizde, * aynı kimlik bilgilerinin * kullanılmadığı anlamına gelir. Eğer sayfayı (istemcinin kimlik bilgisiyle) doğru bir şekilde doğru bir şekilde anlarsam, sayfaya erişirsek, farklı bir makinede (sunucu) farklı bir işlem indiriyor ve müşteriye sunuyor! – shambulator

+0

Bu kimlik bilgileri web sayfasına nasıl sağlanıyor? Form Kimlik Doğrulaması kullanıyor mu? –

+0

@shambulator Bu sayfaya yönlendirerek ne demek istiyorsun? Bu sayfanın html kodunu almaya çalışıyorum. – mko

cevap

48

Erişmeye çalıştığınız web sayfasının Form Kimlik Doğrulaması'nı kullandığından şüpheleniyorum. Bu, korunan kaynaklara erişebilmek için geçerli bir kimlik doğrulama bilgisi sağlamanız gerektiği anlamına gelir. Geçerli bir kimlik doğrulama bilgisi almak için, öncelikle, çerezi yayınlayan LogOn sayfasına bir POST isteği göndererek kendinizi doğrulamanız gerekir. Tanımlama bilgisini aldıktan sonra, korunan kaynaklarla ilgili sonraki taleplerde gönderebilirsiniz. Ayrıca, WebClient kutusunun kutusunun çerezleri desteklemediğini de unutmayın. nedeniyle ASP.NET ViewState crapiness için Açıkçası

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

:

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

Artık 2 istekleri ateşlemesi için bu istemci kullanabilirsiniz: Bu nedenle özel bir çerez farkında web istemcisi yazabilirsiniz Oturum açma isteğinizde birkaç tane başka parametre göndermeniz gerekebilir. İşte yapabilecekleriniz: bir web tarayıcısında kimlik doğrulaması yapın ve FireBug ile gönderilmesi gereken tam parametreleri ve başlıklara bakın.

+0

Çözüm güzel ve temiz görünüyor. Giriş koleksiyonu için isimler gerçekten kullanıcı adı ve şifre olmalı mı? Ve form tabanlı auth olmasına rağmen geçerli kimlik bilgilerini kullanmak için uygulama için farklı bir yolu var mı? – mko

+0

@John, Giriş isminin kullanıcı adı ve şifre olması gerekip gerekmediğini bilmiyorum. Bu, Logon sayfanızın nasıl uygulandığına ve hangi parametrelerin beklediğine bağlı olacaktır. Ve hayır, başka bir yolu yok. Geçerli bir form kimlik doğrulama çerezi edinmeniz gerekir ve böyle bir çerezi elde etmenin tek yolu, oturum açma sayfanıza doğru kimlik bilgileri sağlayarak. Sadece form kimlik doğrulama çerezleri yayan bu sayfadır (umarım :-)). –

+0

kodu çalışmıyor, ancak bu fikri anlıyorum ve çalışmaya çalışacağım. – mko