【问题标题】:How to add two authorization headers in HttpClient如何在 HttpClient 中添加两个授权标头
【发布时间】:2018-08-13 08:56:43
【问题描述】:

我需要在 HttpClient 中添加两个 Authorization 标头,如下所示:

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

但似乎最后一个会覆盖第一个。

我需要 Basic 和 Bearer 令牌。承载令牌让我通过托管 SAP WebService 的代理服务器,SAP 服务器的基本令牌。在这种情况下,我该怎么办?

更新:

如何编写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);

【问题讨论】:

  • 我认为 HTTP 规范还允许您只设置一个 Authorization 标头。否则,可以在此处指定一个集合。添加多个相同 ID 的 header 似乎没有意义。
  • 我需要 Basic 和 Bearer 令牌。承载令牌让我通过托管 SAP WebService 的代理服务器,SAP 服务器的基本令牌。这种情况下,我该怎么办?
  • @MilkBottle 您将需要两个单独的客户端,每个客户端都有自己的默认授权标头,或者一个没有默认值且每个请求都设置授权的客户端。

标签: xamarin.forms dotnet-httpclient


【解决方案1】:

在这种情况下,我该怎么办?

您将需要两个独立的客户端,每个客户端都有自己的默认授权标头,

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

或一个没有默认值且每个请求都设置了授权的客户端。

例如

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

//...

【讨论】:

  • 我刚刚更新了代码。你能告诉我如何在一个 HttpClient 下编写 2 个 HttpRequestMessage 并发送吗?谢谢
  • 它似乎不起作用。此 webServiceUrl 用于身份验证的 Adfs。我错过了什么吗?
【解决方案2】:

它必须与HTTP做更多的事情。它不可能通过多个Authentication headers发送

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-04
    • 2017-07-06
    • 2021-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多