2011-09-12 4 views
30

残りのクライアントを構築するためにHttpClientで少し精緻化しています。しかし、私は把握することはできませんまた、どのようにサーバーに向かって認証する方法の例を見つける。おそらく私は基本的なautを使用しますが、実際にどのような例であれ評価されるでしょう。以前のバージョンではHttpClientと.net4に基づいてRest-clientで認証する方法

(オンラインの例を持っている)あなたがやった:TransportSettingsプロパティは、もはやバージョン0.3.0に存在するしかし

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

答えて

66

これらはすべて古くなっています。次のようにそれを行うには、最終的な方法は、次のとおりです。

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

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

これは.NET 4.5で動作する唯一の回答です – Frank

+5

私はVS2013と.NET 4.5を使用しています認証ヘッダが設定されていません。私はプロパティを介して直接ヘッダーを設定することができます。他に何が欠けていますか? – Alex

+4

@Alex 'HttpClientHandler.PreAuthenticate = true'を設定しようとしてください。http://msdn.microsoft.com/en-us/library/system.net.http.httpclienthandler.preauthenticate.aspx –

0

私はちょうど0.3.0をダウンロードしましたが、実際に削除されています。明示的にHttpClientChannelの既定のインスタンスを使用して指定されていない場合はHttpClientChannel

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

になりましたです。

更新:これは現在、.Net 4.5では無効です。以下の正解を参照してください:https://stackoverflow.com/a/15034995/58391

+0

古いバージョンのですか?私はナゲットから0.3.0を使用しています。 – Tomas

+0

@トーマスRSKのものはプロトタイプでした。ナゲットのバージョンは、プロトタイプから学んだことに基づいて、別のチームによって書き直されました。 –

+0

プリエンプティブ認証を追加した後に動作します。ありがとう – Tomas

17

HttpClientライブラリは.Net 4.には入っていませんでしたが、こちらはhttp://nuget.org/List/Packages/HttpClientです。ただし、このバージョンのHttpClientでは、認証が異なる方法で行われます。

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

または

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); 

と警告され、このライブラリは、来週の更新を取得するつもりされ、マイナー破断変更があります!

+0

Yupp、混乱して申し訳ありません。それはナゲットのものだ。 – Tomas

+1

私はその周りで遊んだが、私はそれを働かせるように見えなかった。しかし、私が理解するように、 "..."はunameでなければなりません:pwd base64 encoded? – Tomas

+0

@トーマス。 –

8

私はダンカンの提案を試みたが、それは私の場合には動作しませんでした。私はそれが、私が統合していたサーバー、チャレンジを送信しなかった、または認証を要求しなかったからだと思います。私はAuthorizationヘッダーを提供しなかったので、私の要求を拒否しました。例はここだけBasic authenticationで動作することを

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. 
} 

お知らせ:

は、だから私は、代わりに次のことをやりました。

1

HttpClientHandlerを使用することは、少なくともサーバー管理者の資格情報を必要とするCouchDB APIへの認証された呼び出しを試行するためのものではありません。

この

は私のために働いた:

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

ここでの回答で概説したように:私はこれは少し古いですが、更新の答えを探している人のためにと考えてい

How to use credentials in HttpClient in c#?

+0

これは@Renè答え[ここに上]と同じです(http://stackoverflow.com/a/22096194/540776)? – superjos

1

、Iテストサーバーを構築したときにこのコードを使用しました。

 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)); 

それともこれはあまりにも動作します:

  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); 
       } 
      } 
関連する問題