azure - 使用 Azure 服务总线 API 管理队列的授权失败
问题描述
我正在尝试使用 Azure 服务总线 api 从某些队列中清除消息。
根据文档(https://docs.microsoft.com/en-us/rest/api/storageservices/clear-messages),我将使用以下请求执行此操作:
https://myaccount.queue.core.windows.net/myqueue/messages
这看起来很简单,但问题是我无法让这个请求正确授权。(结果 = 401 未经授权)
显然,签名过程相当详尽,并在此处进行了描述(https://docs.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key)
我有很多尝试,比如下面的代码:
var httpClient = new HttpClient();
using (HMACSHA256 hmac = new HMACSHA256())
{
var StringToSign = $"GET\n\n\n\n\n\n\n\n\n\n\n\nx-ms-date:{DateTime.UtcNow.ToString("o")}\nx-ms-version:2015-02-21\n\n\n\n";
var stringToSignHash = hmac.ComputeHash(Encoding.UTF8.GetBytes(StringToSign));
var base64StringToSign = Convert.ToBase64String(stringToSignHash);
var signature = $"{base64StringToSign}, {MySecretKey}";
using (HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Delete, "https://myaccount.servicebus.windows.net/myqueue/messages"))
{
//requestMessage.Headers.Add("x-ms-date", DateTime.UtcNow.ToString());
requestMessage.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("SharedKey", signature);
var result = httpClient.SendAsync(requestMessage).GetAwaiter().GetResult();
}
}
对于 MySecretKey,我使用了我的共享访问策略密钥。我尝试按原样使用,并将base64解码为ascii。
有没有人在这方面取得更大的成功?是否有更简单的方法来访问 api?
谢谢。
解决方案
您可以利用此处以不同语言编写的代码来生成 SAS 令牌。
更新: 您能否确认您正在尝试执行哪个 API?根据代码,您在 myaccount.servicebus.windows.net(即服务总线资源)上调用 Delete 方法。删除 API操作完成对锁定消息的处理,并将其从队列或订阅中删除。您共享的示例/参考文章用于从存储队列中删除消息。如果您的要求是清除服务总线队列中的所有消息,那么您需要使用Recieve 和 Delete API。或者,您也可以使用服务总线资源管理器来清除消息。
推荐阅读
- arrays - Swift从具有不同索引的其他字典数组中获取值
- components - 如何删除 OpenFire XMPP 服务器的外部组件?
- apache - 如何在 ubuntu 18.04 中安装 QPID C++ 消息代理
- google-cloud-platform - 谷歌云存储服务器登录的完整性和及时性
- php - 如何获取视频/音频通话时间通话/历史记录 quickblox?
- javascript - 在 puppeteer 中访问子元素
- networking - 生成 Hyperledger Fabric 网络 v-1.2 时出错
- javascript - 选择元素 $(this).find() 不起作用
- wpf - 如何在 XAML 中为 TextEdit 绑定 Mask 属性?
- amazon-web-services - 如何跨所有 AWS 区域调用 Lambda 函数?