繁体   English   中英

来自 Azure 函数的 C# HttpClient POST 请求带有用于第三方 API 的授权标记,被剥离了标头和正文

[英]C# HttpClient POST requests from Azure Function with Authorization tag intended for third-party API are stripped of Headers and Body

更新

我能够发布工作请求。 第三方 API 让我们发送令牌(基本上是 Guid)作为不记名令牌。 Azure 似乎对此进行了某种预验证。 当我用真正随机生成的不记名令牌换出 GUID 时,它起作用了。

我仍然想知道是否有办法禁用此签入 Azure。 “坏”承载令牌适用于 GET 请求,但无法用于 POST/PUT 请求。

应用程序摘要我们有 Azure Functions(即时间触发器、Orchestrator、Activities),它们在 SQL 中查找本地队列表中的项目,然后通过 JSON 将其发布到第三方 API。

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

技术概述

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

附加信息

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

什么有效所有 GET 请求。 完全没有问题。

什么不起作用POST 请求。 我将请求代理给了一个 Beeceptor,以准确查看收到的内容。 当包含 Authorization 标头时,大部分标头都会被剥离(即 Content-Type、Content-Length)并且请求的正文为空白。

如果我删除了 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...”); 这样的令牌? 然后检查尝试是否成功?

问题的解决方案? 即使在 DB 层也不要忽视单元测试。 简而言之,该问题与 Azure 无关,而与数据如何(或未)馈入它有关。

感谢所有提供见解和建议的人。 你们都帮助我通过淘汰的过程寻找解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM