2009-11-09 2 views
31

Tôi đang cố gắng sử dụng HTTPWebRequest để truy cập dịch vụ REST và gặp sự cố khi gửi thông tin đăng nhập, xem mã bên dưới. Tôi đã đọc rằng NetworkCredential không hỗ trợ SSL và tôi đang truy cập trang web HTTPS. Có ai biết về một lớp học tương tự như NetworkCredential không hỗ trợ SSL?HttpWebRequest không chuyển Thông tin đăng nhập

Uri requestUri = null; 
Uri.TryCreate("https://mywebserver/webpage", UriKind.Absolute, out requestUri); 
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(requestUri); 
NetworkCredential nc = new NetworkCredential("user", "password"); 
request.Credentials = nc; 
request.Method = WebRequestMethods.Http.Get; 
HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 

Trả lời

20

Nếu máy chủ của bạn sử dụng xác thực NTLM bạn có thể thử này:

CredentialCache cc = new CredentialCache(); 
cc.Add(
    new Uri("https://mywebserver/webpage"), 
    "NTLM", 
    new NetworkCredential("user", "password")); 
request.Credentials = cc; 
+0

này làm việc cho tôi, cảm ơn. –

3

Hãy thử thiết lập request.PreAuthenticate là true.

+1

Theo [this] (http://weblog.west-wind.com/posts/2010/Feb/18/NET-WebRequestPreAuthenticate-not-quite-what-it-sounds-like) nó sẽ không hoạt động. Vẫn yêu cầu một số công việc – chaZm

25

Cơ chế xác thực nào đang bảo vệ dịch vụ web? Thông tin xác thực được đặt trên HttpWebRequest sẽ chỉ được chuyển qua tiêu đề Authorization của HTTP qua Basic, Digest hoặc NTLM. Vì vậy, nếu dịch vụ web của bạn được bảo vệ bằng WS-Security, thì NetworkCredentials có thể sẽ không được chuyển sang sơ đồ xác thực, vì WS-Security không hoạt động ở cấp HTTP.

Điều bạn cần làm là tạo proxy máy khách dịch vụ Web cho dịch vụ web thông qua công cụ dòng lệnh wsdl.exe hoặc một cái gì đó tương tự. Điều đó sẽ cho phép bạn truy cập vào các lược đồ xác thực nhận thức dịch vụ Web.

Cập nhật sau khi nhận xét:

Nó có vẻ như HttpWebRequest nhu cầu để nhận được các thách thức WWW-Authenticate với một 401 Unauthorized trước khi nó có thể xác thực đúng qua SSL. Tôi đoán có hai đường dẫn mã riêng biệt trong HttpWebRequests xử lý lưu lượng HTTP thông thường và lưu lượng HTTPS được mã hóa. Dù sao, những gì bạn nên thử, là:

  1. Thực thi chưa được xác thực HttpWebRequest đến https://.../ URI.
  2. Nhận phản hồi 401 Unauthorized.
  3. Thực hiện cùng một yêu cầu, bây giờ với cả hai Credentials đặt (không chắc chắn nếu PreAuthenticate phải là true hoặc false; kiểm tra cả hai).
  4. Bây giờ bạn sẽ nhận được 200 OK hoặc bất cứ điều gì Dịch vụ web của bạn phản hồi.

Một lựa chọn khác là xây dựng Authorization tiêu đề mình theo yêu cầu ban đầu:

string credentials = String.Format("{0}:{1}", username, password); 
byte[] bytes = Encoding.ASCII.GetBytes(credentials); 
string base64 = Convert.ToBase64String(bytes); 
string authorization = String.Concat("Basic ", base64); 
request.Headers.Add("Authorization", authorization); 
+0

Xin lỗi, tôi đã không nhận ra cho đến bây giờ rằng nó là một dịch vụ REST tôi đang gọi, do đó, bây giờ có tập tin wsdl. Ngoài ra, tôi có thể đi bộ mã trong trình gỡ lỗi, và tôi có thể nhìn thấy nó xây dựng đối tượng NetworkCredentials đúng cách, nhưng nó chỉ dường như không được thông qua với HttpWebRequest. Một điều nữa - tôi có thể thành công gọi dịch vụ REST bằng cách nhập nó vào thanh địa chỉ trình duyệt của tôi, vì vậy nó phải sử dụng thông tin đăng nhập của tôi theo cách đó. –

+1

Bạn chưa viết sơ đồ xác thực bạn đang sử dụng và nơi bạn có thông tin đăng nhập của mình. Thêm vào đó, nếu đây là một dịch vụ REST, nó không nên có một tệp WSDL. Một dịch vụ Web với một tệp WSDL thường là một dịch vụ Web SOAP, là đối diện trực tiếp của một dịch vụ Web REST. Có thể truy cập Dịch vụ Web bằng trình duyệt (mà không cần nhập bất kỳ thông tin xác thực nào?) Có vẻ như được bảo vệ bằng xác thực HTTP, có thể là NTLM. Điều này có đúng không? –

+0

Ngoài ra, phản hồi bạn nhận được là gì? Nó có phải là '401 trái phép', '403 cấm' hay cái gì khác không? –

48

Xem nếu nó xuất hiện khi bạn sử dụng kiểu cũ phương pháp:

string credentials = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes("user"+ ":" + "password")); 
request.Headers.Add("Authorization", "Basic " + credentials); 
+0

điều này chỉ làm việc cho tôi. – ryancammer

+0

cũng làm việc cho tôi. – SouthShoreAK

+0

Giải quyết được sự cố của tôi. Được thăng hạng vì tính đồng nhất của nó. – Skitterm