MilkBottle
MilkBottle

Reputation: 4332

How to add two authorization headers in HttpClient

I need to add two header of Authorization in HttpClient as below:

client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", "XYZNQVJJTkFQUDpX...=");
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", jwToken);

But it seems the last one will override the first one.

I need the Basic and Bearer token. Bearer token for me to pass through the Proxy server which host the SAP WebService, the Basic token for the SAP server. In this case, what I should do?

Update:

How to compose 2 HttpRequestMessage?

string webServiceUrl = "https://adfs.xxx.xxx/";

string strURL = "https://xxx.xxx.xxx/";

HttpResponseMessage responseMessage;

HttpClient client = new HttpClient();

//--1st HttpRequestMessage

var tokenRequest = new HttpRequestMessage(HttpMethod.Post, strURL);

tokenRequest.Headers.Authorization = new AuthenticationHeaderValue("Basic", "XYZNQVJJTkFQUDpX...=");


 HttpContent httpContent = new FormUrlEncodedContent(
        new[]
          {
             new KeyValuePair<string, string>("grant_type", "xxx"),
             new KeyValuePair<string, string>("client_id", "xxx"),
             new KeyValuePair<string, string>("scope", "xxx"),
             new KeyValuePair<string, string>("assertion", Base64Assertion)

           });

   tokenRequest.Content = httpContent;

   var tokenResponseMessage = await client.SendAsync(tokenRequest);

   var token = await tokenResponseMessage.Content.ReadAsStringAsync();

 //-- 2nd HttpRequestMessage

   var serviceRequest = new HttpRequestMessage(HttpMethod.Get, webServiceUrl);

   serviceRequest.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);

   var serviceResponseMessage = await client.SendAsync(serviceRequest);

Upvotes: 0

Views: 4265

Answers (2)

Nkosi
Nkosi

Reputation: 247183

In this case, what I should do?

You will need two separate clients, each with their own default authorization header,

client1.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", "XYZNQVJJTkFQUDpX...=");
client2.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", jwToken);

or one client with no default and the authorization set per request.

For example

var tokenRequest = new HttpRequestMessage(HttpMethod.Post, authServerUrl);
tokenRequest.Headers.Authorization = new AuthenticationHeaderValue("Basic", "XYZNQVJJTkFQUDpX...=");

var httpContent = new FormUrlEncodedContent(
  new[]
  {
    new KeyValuePair<string, string>("grant_type", "xxx"),
    new KeyValuePair<string, string>("client_id", "xxx"),
    new KeyValuePair<string, string>("scope", "xxx"),
    new KeyValuePair<string, string>("assertion",Base64Assertion)

   });

tokenRequest.Content = httpContent;

var tokenResponseMessage = await client.SendAsync(tokenRequest);          

var token = await responseMessage.Content.ReadAsStringAsync();

var serviceRequest = new HttpRequestMessage(HttpMethod.Get, webServiceUrl);
serviceRequest.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);

var serviceResponseMessage = await client.SendAsync(serviceRequest);  

//...

Upvotes: 1

LeRoy
LeRoy

Reputation: 4436

It has to do more with HTTP.Its not possible to send through multiple Authentication headers

Upvotes: 0

Related Questions