Próbuję napisać kod, który uwierzytelni się na stronie wallbase.cc. Mam spojrzał na to, co jest za pomocą narzędzi Firfebug/Chrome Developer i wydaje się dość proste:Problemy z uwierzytelnianiem na stronie z kodu
post „usrname = $ USER & pass = $ PASS & nopass_email = Typ + w + your + e-mail + i + naciśnij + wprowadź & nopass = 0 "do strony" http://wallbase.cc/user/login ", przechowuj zwrócone pliki cookie i używaj ich we wszystkich przyszłych zamówieniach.
Oto mój kod:
private CookieContainer _cookies = new CookieContainer();
//......
HttpPost("http://wallbase.cc/user/login", string.Format("usrname={0}&pass={1}&nopass_email=Type+in+your+e-mail+and+press+enter&nopass=0", Username, assword));
//......
private string HttpPost(string url, string parameters)
{
try
{
System.Net.WebRequest req = System.Net.WebRequest.Create(url);
//Add these, as we're doing a POST
req.ContentType = "application/x-www-form-urlencoded";
req.Method = "POST";
((HttpWebRequest)req).Referer = "http://wallbase.cc/home/";
((HttpWebRequest)req).CookieContainer = _cookies;
//We need to count how many bytes we're sending. Post'ed Faked Forms should be name=value&
byte[] bytes = System.Text.Encoding.ASCII.GetBytes(parameters);
req.ContentLength = bytes.Length;
System.IO.Stream os = req.GetRequestStream();
os.Write(bytes, 0, bytes.Length); //Push it out there
os.Close();
//get response
using (System.Net.WebResponse resp = req.GetResponse())
{
if (resp == null) return null;
using (Stream st = resp.GetResponseStream())
{
System.IO.StreamReader sr = new System.IO.StreamReader(st);
return sr.ReadToEnd().Trim();
}
}
}
catch (Exception)
{
return null;
}
}
Po wywołaniu HttpPost z moich parametrów logowania spodziewałbym wszystkie przyszłe połączenia za pomocą tej samej metody, aby być uwierzytelniony (zakładając poprawną nazwę użytkownika/hasło). Dostaję plik cookie sesji w mojej kolekcji plików cookie, ale z jakiegoś powodu nie jestem uwierzytelniony. Dostaję plik cookie sesji w zbiorze plików cookie, niezależnie od tego, którą stronę odwiedzę, dlatego próbowałem najpierw załadować stronę główną, aby uzyskać plik cookie sesji początkowej, a następnie zalogować się, ale nie było żadnych zmian.
Według mojej wiedzy ta wersja Python działa: https://github.com/sevensins/Wallbase-Downloader/blob/master/wallbase.sh (linia 336)
pomysłów, w jaki sposób dostać uwierzytelniania działa?
Aktualizacja # 1
Podczas korzystania prawidłowe użytkownik/hasło powiązać odpowiedź automatycznie przekierowuje do polecający ale po odebraniu niepoprawne Użytkownik/hasło para nie przekierować i zwraca złe użytkownik/hasło parę. Na tej podstawie wydaje się, że uwierzytelnianie się dzieje, ale może nie wszystkie kluczowe informacje są zapisywane?
Aktualizacja # 2
Używam .NET 3.5. Kiedy wypróbowałem powyższy kod w .NET 4, z dodaną linią System.Net.ServicePointManager.Expect100Continue = false
(która była w moim kodzie, właśnie nie pokazana tutaj) to działa, bez zmian koniecznych. Problem wydaje się wynikać bezpośrednio z niektórych problemów z pre-Net4.
Musisz się upewnić, że zamknąłeś/wyrzuciłeś 'response' - lub umieściłeś go w bloku' using() '. Czy korzystasz ponownie z tego samego kontenera z ciasteczkami na kolejnych prośbach? – debracey
@debracey: Używam tego samego kontenera cookie, kontener cookie to prywatna zmienna poziomu klasy, która jest ponownie używana dla każdego HttpPost. Poprawiłem swój kod, aby używać bloków i zaktualizowałem kod w moim pytaniu, bez zmian. – Peter