2010-11-17 38 views
6

để truy cập Internet Tôi đứng sau một proxy yêu cầu xác thực. Tôi biết việc chuyển thông tin đăng nhập mạng cho proxy như thế này khá đơn giản:Hiển thị hộp thoại xác thực proxy trong C#

FtpWebRequest request = FtpWebRequest.Create(
         new Uri("ftp://upload.myserver.com") as FtpWebRequest; 

NetworkCredential credentials = new NetworkCredential("username", "password"); 
request.Credentials = credentials; 

Công việc này!

Tôi cũng đã cố gắng sử dụng CredentialCache.DefaultNetworkCredentials nhưng điều đó không hiệu quả. Tôi muốn tránh lưu trữ tên người dùng và mật khẩu bất cứ nơi nào (mã, cơ sở dữ liệu, tập tin cấu hình).

Tôi nghĩ cách dễ nhất là sử dụng cùng một hộp thoại được hiển thị khi tôi truy cập Internet bằng Internet Explorer. Có ai biết làm thế nào để nâng cao hộp thoại này?

http://services.arcgisonline.com/arcgisexplorer500/help/proxy_connect_to_on_browser_request.png

EDIT

Mục tiêu của nhiệm vụ này là để tải lên một tập tin qua FTP. Cuối cùng tôi phát hiện ra rằng không cần phải thiết lập proxy cho các yêu cầu FTP vì .NET framework không cho phép hoạt động FTP thông qua proxy HTTP. Nhưng bạn phải đặt thuộc tính proxy một cách rõ ràng thành null.

FtpWebRequest request = FtpWebRequest.Create(
         new Uri("ftp://upload.myserver.com") as FtpWebRequest; 

NetworkCredential credentials = new NetworkCredential("username", "password"); 
request.Credentials = credentials; 
request.Proxy = null; 

Thats it!

+0

Tôi không có đủ kiến ​​thức về chủ đề để trả lời câu hỏi của bạn, chỉ cần tạo biểu mẫu đăng nhập, nơi bạn phải nhập tên người dùng và mật khẩu của mình trước khi kết nối. – Nick

+0

Hi Nick, tất nhiên điều này sẽ dễ dàng để làm, nhưng với tôi nó có vẻ như tái phát minh ra bánh xe. Ngay cả trong [MSDN] (http://msdn.microsoft.com/en-us/library/aa983441.aspx) hộp thoại này được đề cập. – Jan

Trả lời

2

Trước hết, id nói rằng đây không phải là hộp thoại IE. Nó phải là một hộp thoại hệ thống dựng sẵn.
Hơn nữa nếu bạn gọi nó, bạn vẫn sẽ cần truy cập các giá trị đã nhập và sử dụng các giá trị đó trong mã của bạn. Hộp thoại đó chỉ là một cửa sổ nhập liệu, nó sẽ không cho phép ứng dụng của bạn truy cập vào proxy/internet! Ngoài ra tất cả các lỗi xử lý (sai, thông tin đăng nhập, vv) phải được thực hiện một mình.
Tôi nghĩ rằng có thể dễ dàng hơn, để kiểm tra xem proxy có cần thiết hay không (sử dụng cửa sổ đăng ký, wmi, v.v.) và bật lên một biểu mẫu tùy chỉnh để bạn có thể truy cập và tái sử dụng các giá trị một cách dễ dàng.

+0

Tôi nghĩ rằng nó sẽ dễ dàng hơn để làm, như gọi một phương pháp khung kiểm tra kết nối mạng chính nó và bật lên hộp thoại chính nó. Sau khi tất cả các bạn là hoàn toàn đúng! Tôi đã làm nó bản thân mình và như xa như tôi có thể nhìn thấy mỗi chương trình đi kèm với hộp thoại xác thực proxy của nó (Firefox, Kaspersky, vv) – Jan

0

có thể điều này có thể giúp bạn. Bạn không chắc chắn đó là chính xác những gì bạn đang tìm kiếm.

http://sturla.simnet.is/post/2008/09/22/Enable-proxy-in-IE.aspx

+0

Cảm ơn, nhưng đó không phải là điều tôi đang tìm kiếm. Cuối cùng tôi tìm thấy một nơi khác hộp thoại tôi muốn hiển thị. – Jan

3

Trong bài viết MSDN "Handling Authentication", tác giả viết:

Proxy Xác thực

Khi một khách hàng cố gắng sử dụng một proxy yêu cầu xác thực, proxy trả về một mã số 407 tình trạng tin nhắn cho khách hàng. Trong thông báo đó, proxy phải bao gồm một hoặc nhiều tiêu đề phản hồi Proxy-Authenticate . Các tiêu đề này bao gồm các phương thức xác thực có sẵn từ proxy. WinINet chọn phương thức đầu tiên là .

Các InternetErrorDlg function thể được sử dụng để có được tên người dùng và mật khẩu dữ liệu từ người dùng, hoặc một giao diện người dùng tùy chỉnh có thể được thiết kế.

Sau khi tìm kiếm lâu hơn một chút, tôi tìm thấy bài viết Cơ sở tri thức Microsoft "How To Handle Proxy Authorization with WinInet", ví dụ về cách sử dụng chức năng này để xác thực người dùng proxy.

Họ cung cấp một (C++) ví dụ mã với:

if (InternetErrorDlg (GetDesktopWindow(), 
     hReq, ERROR_INTERNET_INCORRECT_PASSWORD, 
     FLAGS_ERROR_UI_FILTER_FOR_ERRORS | 
     FLAGS_ERROR_UI_FLAGS_GENERATE_DATA | 
     FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS, 
     NULL) == ERROR_INTERNET_FORCE_RETRY) 
      goto again; 

(Xem this MSDN blog post cho một P/Gọi ví dụ về InternetErrorDlg chức năng).

Các "Xử lý xác thực" bài báo cũng tuyên bố:

Một giao diện tùy chỉnh có thể sử dụng InternetSetOption function để thiết lập các giá trị INTERNET_OPTION_PROXY_PASSWORDINTERNET_OPTION_PROXY_USERNAME và sau đó gửi lại yêu cầu đến proxy.

Vì vậy, tôi sẽ giả định rằng sau "công việc" có thể thành công:

  1. Đặt proxy để sử dụng proxy mặc định với một cái gì đó giống như request.Proxy = WebRequest.GetSystemWebProxy().
  2. Yêu cầu URL với HttpWebRequest (hoặc FtpWebRequest).
  3. Nếu 407 mã trạng thái HTTP trả về, hãy gọi hàm InternetErrDlg.
  4. Thử lại yêu cầu URL.

này thể làm việc kể từ this answer bang mà ông sử dụng thành công WebRequest khi ông chỉ vừa mới mở Internet Explorer và nhập thông tin ủy quyền của mình ở đó. Vì vậy, giả định của tôi là thông tin proxy được lưu trữ ở đâu đó trong "phiên người dùng" Windows miễn là người dùng đăng nhập và có sẵn cho tất cả các ứng dụng sau khi xác thực.

Vì tôi đang đối mặt với cùng một vấn đề với áp phích gốc, giờ tôi sẽ cố gắng xem các đề xuất của tôi thực sự hoạt động như thế nào.

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