【问题标题】:Azure App Config HMAC authentication returns Unauthorized errorAzure App Config HMAC 身份验证返回未经授权的错误
【发布时间】:2021-10-27 19:33:29
【问题描述】:

我正在关注this 教程,该教程介绍了对 Azure App Config 进行 REST 调用以使用 HMAC 身份验证添加键值条目。 JS 和 c# 版本都不起作用 - 我最终得到 401 Unauthorized 错误提示

HMAC-SHA256 error="invalid_token", error_description="Invalid Signature"

我的 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 错误?

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

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

解决方案:确保字符串签名正确。确保 Secret 正确且使用正确(使用前已解码 base64)。

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

【问题讨论】:

    标签: c# .net-core hmac azure-app-configuration


    【解决方案1】:

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

    【讨论】:

    • 太棒了 - 适用于 C# 实现,但这似乎与 JS 实现注释 secret) // access key value (base64 encoded) 相矛盾?这让我感到困惑 - 秘密基地 64 是否编码?你能包括等效的 JS 调用是什么样的吗?
    • @auburg,您从 Azure 门户获得的秘密是 base64 en编码的。该文件建议在使用前应对密钥进行 base64 de编码。可以更新 C# 示例代码以包含对 Convert.FromBase64String 的调用,因此它与已经进行 base64 解码的其他示例(包括 JS)更加一致。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      可能是 TLS 要求

      尝试:

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

      在创建客户端之前。

      【讨论】:

      • 所以这很可能是您请求的内容。你能验证你的内容是有效的 SHA256 哈希吗?
      • 如果回答了您的问题,请查看我上面的编辑?
      • 我通过在此处输入密钥和内容codebeautify.org/hmac-generator 比较了生成的 SHA256 哈希,它们匹配
      猜你喜欢
      • 1970-01-01
      • 2020-03-15
      • 2022-12-13
      • 2020-10-25
      • 2021-07-17
      • 2018-07-12
      • 2018-06-13
      • 1970-01-01
      相关资源
      最近更新 更多