来自 Azure 函数的 C# HttpClient POST 请求,带有用于第三方 API 的授权标记,被剥离了标头和正文
Posted
技术标签:
【中文标题】来自 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 【发布时间】:2021-10-19 18:20:11 【问题描述】:更新
我能够发布一个工作请求。第三方 API 让我们将令牌(基本上是一个 Guid)作为不记名令牌发送。 Azure 似乎对此进行了某种预验证。当我用真正随机生成的不记名令牌替换 GUID 时,它起作用了。
我仍然想知道是否有办法禁用此签入 Azure。 “坏”的 Bearer 令牌适用于 GET 请求,但适用于 POST/PUT 请求。
申请摘要 我们有 Azure Functions(即 Time Trigger、Orchestrator、Activities),它们在 SQL 中查找本地队列表中的项目,然后通过 JSON 将其发布到第三方 API。
第三方 API 在 POST 请求中需要 Authorization 标头。
技术概述
dotnet 核心 3.1 azure 函数运行时 ~3其他信息
此代码库在今年 4 月至 5 月的 UAT 期间运行良好。然后它一直闲置,直到我们在几周前重新启动该项目。 出站请求不通过 APIM 代理。它们直接发送到第三方 API 为 Azure Function 配置 Application Insights什么有效 所有 GET 请求。完全没有问题。
什么不起作用 POST 请求。我将请求代理给了一个 beeceptor,以查看到底收到了什么。当包含 Authorization 标头时,大部分标头都被剥离(即 Content-Type、Content-Length)并且请求的正文为空白。
如果我删除了 Authorization 标头,那么所有标头和正文都会按预期接收。
问题 在这一点上,我只能假设某些 Azure 服务、飞行前检查、安全策略正在拦截 Authorization 标头,认为它是针对“自身”的,但我完全不知道它可能是什么。我已经使用 Google 好几天了。
简化版代码
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 正文有效 代码确实有效并且保持不变【问题讨论】:
如果将代码复制并粘贴到全新的 Azure Function App 会发生什么。您是否看到相同的行为(错误)? @ThiagoCustodio 是的。我创建了一个新的 Elastic Premium Function App 并重新部署了具有相同行为的所有内容。前一个是运行标准计划。在我们的暂存环境中会遇到相同的行为。我有在本地运行协调器功能的单元测试,并且效果也很好。 您是否尝试过不使用new AuthenticationHeaderValue(
来添加这样的auth 标头:client.DefaultRequestHeaders.Add("Authorization", "Bearer " + queueItem.Request.Client.AuthToken);
?
我做到了。我什至尝试了诸如 .Add("Authorization", $"Token queueItem.Request.Client.AuthToken");和 .Add("Authorization", "alsdfjslfjalsfjlaksfjl") 以消除 Auth 标头的“承载”部分。
愚蠢的问题,但代码在 Azure 函数 \ Azure 函数运行时之外的控制台应用程序中是否正常工作(或多或少)?
【参考方案1】:
鉴于你已经尝试过,这可能是一个很长的机会,但你是否尝试过像这样添加令牌:
client.DefaultRequestHeaders.TryAddWithoutValidation(“Authorization”, “bearer token here…”);
然后检查尝试是否成功?
【讨论】:
我做到了。如果它失败并且条件通过(即没有抛出异常),我已经准备好抛出一个 Exception()。以上是关于来自 Azure 函数的 C# HttpClient POST 请求,带有用于第三方 API 的授权标记,被剥离了标头和正文的主要内容,如果未能解决你的问题,请参考以下文章