2009-03-12 33 views
6

Tôi là một anh chàng hệ thống và hiện đang thực hiện dự án phát triển web bán thời gian nên tôi khá mới với nó. Tôi đang cố gắng viết một ứng dụng khách http cho www.portapower.com.HttpWebRequest và xác thực biểu mẫu trong C#

Nó sẽ cho một số mặt hàng được đăng trên trang web và nếu chúng phù hợp với yêu cầu cụ thể, nó sẽ in một tin nhắn.

Trong khi cố gắng truy cập trang này:

http://www.portapower.com/getbainfo.php?fclasscode=1&code=CB1831B.40H&fbrand=QUNFUg==

Trang web chuyển hướng tôi đến một trang đăng ký mặc định:

http://www.portapower.com/defaregit.php

Dưới đây là một đoạn của những gì tôi mã:

CookieContainer myContainer = new CookieContainer(); 

HttpWebRequest request = (HttpWebRequest) 
WebRequest.Create("http://www.portapower.com/" + urlpart); 
request.Credentials = new NetworkCredential("****", "******"); 
request.CookieContainer = myContainer; 
request.PreAuthenticate = true; 
request.Method = "POST"; 
HttpWebResponse response = (HttpWebResponse) 
request.GetResponse(); 

Console.WriteLine(response.StatusCode); 
Stream resStream = response.GetResponseStream(); 
Console.WriteLine(resStream.ToString()); 

Tôi có tên người dùng và mật khẩu và nó hoạt động tốt khi được sử dụng từ trình duyệt. Vui lòng cho tôi biết đây có phải là cách chính xác để truy cập trang được xác thực hay không.

Trả lời

6

Tùy thuộc vào cách trang web xác thực người dùng. Nếu họ đang sử dụng xác thực cơ bản hoặc xác thực Windows, thì bạn có thể đặt Credentials property trong số HttpWebRequest class thông tin tên người dùng/mật khẩu/tên miền và nó sẽ hoạt động.

Tuy nhiên, có vẻ như bạn phải nhập tên người dùng/mật khẩu trên trang web, điều đó có nghĩa là bạn sẽ phải đăng nhập vào trang web trước tiên. Nhìn vào trang chính, đây là những gì tôi tìm thấy trong phần tử <form> xử lý thông tin đăng nhập:

<form name="formlogin" method="post" action="./defalogin.php" > 
    <input name="emtext" type="text" id="emtext" size="12"> 
    <input name="pstext" type="password" id="pstext" size="12"> 
    <input type="submit" name="Submit" value="Logn in" 
    onClick="return logincheck()" > 
</form> 

Tôi chỉ bao gồm các phần có liên quan.

Với điều này, bạn phải truy cập trang ./defalogin.php trước tiên với HttpWebRequest và POST các giá trị emtextpstext. Ngoài ra, hãy đảm bảo bạn đặt CookieContainer property thành phiên bản CookieContainer. Khi cuộc gọi đó trả về POST, nhiều khả năng sẽ được phổ biến với cookie mà bạn sẽ phải gửi lại cho trang web. Chỉ cần tiếp tục đặt thuộc tính CookieContainer trên bất kỳ trường hợp HttpWebRequest tiếp theo nào cho số CookieContainer đó để đảm bảo cookie được chuyển qua.

Sau đó, bạn sẽ chuyển đến trang được chỉ ra trong liên kết.

Quan tâm cũng là chức năng javascript logincheck javascript, nhưng nhìn vào nguồn tập lệnh, không có gì đáng chú ý.

0

Lớp NetworkCredential thực sự là để kiểm soát thông tin đăng nhập cửa sổ thông thường (NTLM, Kerberos, v.v.).

Trang web đó là trang web PHP chạy trên Apache, vì vậy tôi không nghĩ rằng họ đang sử dụng NTLM hoặc kerberos.

Những gì bạn muốn làm là đăng một số trường MẪU lên trang web, sau đó giữ lại cookie bạn lấy lại. Đảm bảo các yêu cầu tiếp theo bạn đẩy cookie trở lại trang web để biết bạn đã đăng nhập.

1

Bạn không thể thực hiện theo cách này; các thông tin bạn đang truy cập có thể được sử dụng với lược đồ xác thực cơ bản (ví dụ: trong trình duyệt, bạn nhận được hộp thoại tên người dùng/mật khẩu bật lên.) Bạn sẽ phải mô phỏng mục nhập của dữ liệu vào biểu mẫu đó và nắm bắt đăng nhập cookie và sử dụng nó.

2

Thông tin xác thực bạn đang chuyển cho xác thực cửa sổ. Bạn cần gửi dữ liệu bài đăng với dữ liệu bắt chước việc gửi biểu mẫu, sau đó chuyển tải cookie phiên trong phản hồi và sử dụng cookie đó cho các yêu cầu trong tương lai

Hãy xem câu trả lời này có mã để làm điều này:

Login to the page with HttpWebRequest

Các vấn đề liên quan