2017-11-16 11 views
0

私はMVC5 ASP.NETプロジェクトで作業しており、コントローラからWEB APIに認証されたリクエストを送信することを学んだ(サンプルコードを使用して)ヘッダーにトークンを追加するために以下を行うことができます:HttpClientのAuthorizationヘッダーを安全に設定していますか?

public static class APICaller 
{ 
    // Use a single instance for HttpClient to reduce overhead 
    private static readonly HttpClient client = new HttpClient(); 

    //Set the Authorization Header 
    public static string SetHeader(string token) 
    { 
     client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); 

     return("Success"); 
    } 
} 

HttpClientスレッドセーフでヘッダーをこのように設定していますか?このHttpClientのインスタンスが1つしかないので、他のユーザーはこの同じトークンにアクセスできますか?

EDIT:

私はそれがどのように動作するかの理解を得るために、1つのより多くの質問をお願いしたいと思います。同じHttpClientオブジェクトをリクエストするたびにヘッダーを追加する必要がありますか?

答えて

2

あなたが持っているアプローチでは、静的インスタンスにデフォルトのリクエストヘッダーを設定すると、それを設定しなくても設定されたままになります。これは、サーバーに複数の要求が入った場合、ヘッダーが1人のユーザーに設定され、最初の要求が出てくる前に別の要求によって変更される状況に終わる可能性があることを意味します。

ユーザー固有の承認ヘッダーを使用する場合は、SendAsyncを使用することを避けるための1つの方法があります。これにより、ヘッダーをHttpClient自体のデフォルトとして設定するのではなく、特定のメッセージに結び付けることができます。

コードは、もう少し冗長ですが、このようなものになります:ヘッダが消えるあなたが見ることができるように

using (var httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, "http://path/to/wherever")) 
{ 
    httpRequestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", "TheToken"); 

    using (var httpResponseMessage = httpClient.SendAsync(httpRequestMessage)) 
    { 
     // ... 
    } 
} 

、ヘッダが各要求に特別に設定されているとアップミキシングのため、問題を。明らかな欠点は、この構文がより冗長であることです。

1

このHttpClientのインスタンスが1つしかない場合、他のユーザーも同じトークンにアクセスできますか?

はい、デフォルトヘッダーを設定するときは注意が必要です。

同じHttpClientオブジェクトでリクエストするたびにヘッダーを追加する必要がありますか?

あなたはデフォルトヘッダーを設定するのでいいえ、そのオブジェクトで作成されたすべてのリクエストヘッダーを持つことになります。

ベアラトークンのようなものは、デフォルトのヘッダーを入れずに、新しいHttpRequestMessageオブジェクトを作成し、そこに必要なヘッダーを設定し、次にHttpClient.SendAsync(を使用して要求ヘッダーに渡すことをお勧めしますあなたの要求に沿ってヘッダーを送信します。

関連する問題