用于第三方API的带有Authorization标记的Azure Function的C#HttpClient POST请



更新

我收到了一份工作请求。第三方API让我们发送令牌(基本上是Guid)作为承载令牌。Azure似乎对此进行了某种预验证。当我用一个真正的随机生成的承载令牌交换GUID时,它起了作用。

我仍然想知道是否有一种方法可以禁用此签入Azure。";坏的";承载令牌对GET请求有效,但对POST/PUT请求失败。

应用程序摘要我们有Azure函数(即时间触发器、编排器、活动),它们在SQL中的预处理队列表中查找项目,然后通过JSON将其POST到第三方API。

第三方API需要带有POST请求的Authorization头。

技术概述

  • dotnet核心3.1
  • azure函数运行时-3

附加信息

  • 这个代码库在今年4-5月的UAT期间运行良好。然后它一直闲置着,直到几周前我们重新启动了这个项目
  • 出站请求不通过APIM代理。它们被直接发送到第三方API
  • 为Azure功能配置了Application Insights

工作原理所有GET请求。一点问题都没有。

什么不起作用POST请求。我把这些请求委托给了一位养蜂人,想看看到底收到了什么。当包含Authorization标头时,大多数标头都会被剥离(即内容类型、内容长度),请求的正文为空。

如果我删除了Authorization标头,那么所有标头和正文都会按预期接收。

问题在这一点上,我只能假设一些Azure服务、飞行前检查、安全策略正在拦截Authorization标头,认为它是为";"本身";,但我完全不知道它可能是什么。我已经在谷歌上呆了好几天了。

简化版代码

using var client = new HttpClient();
client.DefaultRequestHeaders.Clear();
// Request params are dynamic and a helper method builds the full request path
var path = PathBuilder(queueItem.RequestParams, queueItem.Request.UrlPath);
// This can change in code not shown if the request is sending files
var contentType = "application/json";
client.BaseAddress = new Uri(queueItem.Request.Client.BaseApiUrl);
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.CacheControl = new CacheControlHeaderValue { NoCache = true };
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", queueItem.Request.Client.AuthToken);
// queueItem.Data is JSON
HttpContent json = new StringContent(queueItem.Data, Encoding.UTF8, contentType);
return await client.PostAsync(path, json);

此外

  • 我已确认JSON主体有效
  • 代码确实有效,并且一直保持不变

考虑到您已经尝试过的所有内容,这可能是一个很长的机会,但您是否尝试过添加以下令牌:

client.DefaultRequestHeaders.TryAddWithoutValidation(“Authorization”, “bearer token here…”);

然后检查尝试是否成功?