0

我正在按照教程对 Azure App Config 进行 REST 调用,以使用 HMAC 身份验证添加键值条目。JS 和 c# 版本都不起作用 - 我最终得到一个 401 Unauthorized 错误说

HMAC-SHA256 error="invalid_token", error_description="无效签名"

我对 C# 实现的调用代码是:

var credential = "<my app config id>";
var secret = Encoding.ASCII.GetBytes(Base64Encode("<my app config secret>"));

UserQuery.MsgRouterConfigValue body = new MsgRouterConfigValue();
var key = "asd1";
body.clientId = Guid.NewGuid();
body.serviceUrl = new Uri("https://someuri");

using (var client = new HttpClient())
{
    var request = new HttpRequestMessage()
    {
        RequestUri = new Uri($"<my app config url>/kv/{key}?label=dev&api-version=1.0"),
        Method = HttpMethod.Put,
        Content = new StringContent(JsonSerializer.Serialize(body)) 
    };
    
    Sign(request,credential, secret);

    var resp = await client.SendAsync(request);
    
}

public static string Base64Encode(string plainText)
{
    var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText);
    return System.Convert.ToBase64String(plainTextBytes);
}

关于我用于凭证和机密的值,它们来自应用程序配置的门户:

在此处输入图像描述

谁能告诉我为什么会收到 401 错误?

编辑:所以这个错误归结为:

原因:提供的签名与服务器期望的不匹配。

解决方案:确保 String-To-Sign 正确。确保 Secret 正确且正确使用(使用前已解码 base64)。

因此,就“确保字符串签名正确”而言,我使用的代码与示例中提供的代码相同,这导致密码错误,但这与应用程序门户中定义的值相同配置。

4

3 回答 3

0

@auburgsecret必须在使用前进行 base64解码。您共享的代码没有这样做。你可能想打电话Convert.FromBase64String

于 2021-09-07T17:09:31.963 回答
0

即使我的凭据有效,我也从 Azure 收到了相同的消息。事实证明,我的本地日期/时间设置不正确(做了一些时钟更改,弄乱了当前时间)。一旦将日期/时间固定为实际的当前时间,它就会恢复正常。

发生这种情况是因为 Azure 发出一个短期令牌并将您的 UTC 时间与他们的时间进行比较,以确保令牌有效。也许并非所有“无效令牌”问题都如此,但绝对值得一试。

于 2021-10-27T11:33:29.167 回答
-1

可能是 TLS 要求

尝试:

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

在创建客户端之前。

于 2021-09-03T15:05:17.680 回答