2011-09-12 33 views
30

Được xây dựng một chút với HttpClient để xây dựng một khách hàng còn lại. Nhưng tôi không thể tìm ra, cũng không tìm thấy bất kỳ ví dụ về cách xác thực đối với máy chủ. Nhiều khả năng tôi sẽ sử dụng aut cơ bản, nhưng thực sự bất kỳ ví dụ nào cũng sẽ được đánh giá cao.Cách xác thực với Rest-client dựa trên HttpClient và .net4

Trong các phiên bản trước đó (trong đó có ví dụ trực tuyến), bạn đã làm:

HttpClient client = new HttpClient("http://localhost:8080/ProductService/"); 
client.TransportSettings.Credentials = 
    new System.Net.NetworkCredential("admin", "admin"); 

Tuy nhiên TransportSettings bất động sản không còn tồn tại trong phiên bản 0.3.0.

Trả lời

66

Tất cả những điều này đã lỗi thời. Cách thức cuối cùng để thực hiện như sau:

var credentials = new NetworkCredential(userName, password); 
var handler = new HttpClientHandler { Credentials = credentials }; 

using (var http = new HttpClient(handler)) 
{ 
    // ... 
} 
+2

Đây là câu trả lời duy nhất hoạt động cho .NET 4.5 – Frank

+5

Tôi đang sử dụng VS2013 và .NET 4.5 Tiêu đề cấp quyền không được đặt. Tôi chỉ có thể đặt tiêu đề trực tiếp thông qua thuộc tính. Tôi còn thiếu gì nữa? – Alex

+4

@Alex thử đặt 'HttpClientHandler.PreAuthenticate = true' http://msdn.microsoft.com/en-us/library/system.net.http.httpclienthandler.preauthenticate.aspx –

0

Tôi vừa tải xuống 0.3.0 nó thực sự đã bị xóa. Hiện tại, trên HttpClientChannel

HttpClient client = new HttpClient(...); 
var channel = new HttpClientChannel(); 
channel.Credentials = new NetworkCredential(...); 
client.Channel = channel; 

Nếu không được chỉ định rõ ràng, nó sử dụng trường hợp mặc định là HttpClientChannel.

CẬP NHẬT: điều này hiện không hợp lệ đối với .Net 4.5; xem câu trả lời chính xác bên dưới: https://stackoverflow.com/a/15034995/58391

+0

Đó là một phiên bản cũ? Tôi đang sử dụng 0.3.0 từ nuget. – Tomas

+0

@Thomas Một trong RSK là một nguyên mẫu. Phiên bản nuget được viết lại, bởi một nhóm khác, dựa trên những gì họ đã học được từ nguyên mẫu. –

+0

Làm điều này để làm việc sau khi thêm auth preemptive. Cảm ơn – Tomas

17

Thư viện HttpClient không đưa vào .Net 4. Tuy nhiên, thư viện có sẵn ở đây http://nuget.org/List/Packages/HttpClient. Tuy nhiên, xác thực được thực hiện khác nhau trong phiên bản này của HttpClient.

var httpClient = new HttpClient(); 
httpClient.DefaultRequestHeaders.Authorization 
        = new AuthenticationHeaderValue("basic","..."); 

hoặc

var webRequestHandler = new WebRequestHandler(); 
CredentialCache creds = new CredentialCache(); 
creds.Add(new Uri(serverAddress), "basic", 
         new NetworkCredential("user", "password")); 
webRequestHandler.Credentials = creds; 
var httpClient = new HttpClient(webRequestHandler); 

Và được cảnh báo, thư viện này sẽ được cập nhật vào tuần tới và có những thay đổi vi phạm nhỏ!

+0

Yupp, xin lỗi vì đã gây nhầm lẫn. đó là phiên bản tôi nhận được, cái từ nuget. – Tomas

+1

Tôi chơi đùa với điều đó, nhưng tôi dường như không thể làm được điều đó. Nhưng như tôi hiểu, "..." nên được uname: pwd base64 mã hóa? – Tomas

+0

@Thomas Chính xác. –

8

Tôi đã thử đề xuất của Duncan, nhưng nó không hoạt động trong trường hợp của tôi. Tôi nghi ngờ đó là vì máy chủ tôi đã tích hợp, không gửi một thách thức hoặc yêu cầu xác thực. Nó chỉ từ chối yêu cầu của tôi, bởi vì tôi không cung cấp tiêu đề Cấp phép.

Vì vậy, tôi thay vì đã làm như sau:

using (var client = new HttpClient()) 
{ 
    var encoding = new ASCIIEncoding(); 
    var authHeader = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(encoding.GetBytes(string.Format("{0}:{1}", "username", "password")))); 
    client.DefaultRequestHeaders.Authorization = authHeader; 
    // Now, the Authorization header will be sent along with every request, containing the username and password. 
} 

Chú ý rằng ví dụ ở đây chỉ làm việc với Basic authentication.

1

Đối với những gì nó có giá trị, không có gì sử dụng HttpClientHandler làm việc, ít nhất là không cố gắng thực hiện một cuộc gọi xác thực đến API CouchDB yêu cầu thông tin quản trị máy chủ.

này đã làm việc cho tôi:

using(var client = new HttpClient()) 
{ 
    var byteArray = Encoding.ASCII.GetBytes("MyUSER:MyPASS"); 
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray)); 
    .... 
} 

Như đã nêu trong câu trả lời ở đây:

How to use credentials in HttpClient in c#?

+0

giống với câu trả lời @ Renè [ở trên đây] (http://stackoverflow.com/a/22096194/540776)? – superjos

1

Tôi tin rằng đây là một chút cũ, nhưng đối với bất cứ ai tìm kiếm một câu trả lời được cập nhật, tôi đã sử dụng mã này khi tôi xây dựng máy chủ thử nghiệm của mình:

 using (var client = new HttpClient()) 
     { 
      client.BaseAddress = new Uri("http://myServer/api/Person"); 
      client.DefaultRequestHeaders.Accept.Clear(); 
      client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
      var byteArray = Encoding.ASCII.GetBytes($"{UserName}:{ApiPassword}"); 
      client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray)); 

Hoặc này hoạt động quá:

  using (var http = new HttpClient()) 
      { 
       // byteArray is username:password for the server 
       var byteArray = Encoding.ASCII.GetBytes("myUserName:myPassword"); 
       http.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray)); 
       string uri = "http://myServer/api/people" ; 
       var response = await http.GetStringAsync(uri); 
       List<Person> agencies = JsonConvert.DeserializeObject<List<Person>>(response); 
       foreach (Person person in people) 
       { 
        listBox1.Items.Add(person.Name); 
       } 
      } 
Các vấn đề liên quan