来自 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 的授权标记,被剥离了标头和正文的主要内容,如果未能解决你的问题,请参考以下文章

来自 C# 的 Azure SQL DB 连接问题

Azure Functions 并发超时

在(隔离的)Azure 函数中运行用户制作的 C# 代码是不是安全?

如何从 C# 中的 Azure 函数在设备中执行方法?

从 C# Azure 函数中访问证书

通过 C# Azure 函数生成 Blob 容器