azure - Azure 服务总线 Restful Api 获取
问题描述
我正在尝试使用 SAS 生成访问 Azure 服务总线 Resftul API。我的理解是我需要生成一个authorization
类似于以下内容的标题:-
SharedAccessSignature sig=<sig>&
se=<epochexpirydate>&skn=RootManageSharedAccessKey&
sr=<urlToQueue>
使用邮递员我尝试发起一个请求https://service-bus-namespace.servicebus.windows.net/queuename
我使用在线 sha256 生成器使用从sr
& \n
&加密到 SHA256的 url 生成我的 SAS 的签名。epoch-time
但是我总是收到 401 SubCode:40103 Invalid authentication token signature。希望有人可以给我帮助,以便我可以从队列中获取消息。
例子:
SharedAccessSignature sig=ab5c0a1b42b96af5ef9cbc85c7088651e9ebf8785d1eeffe6c4955be2c70ca2b&se=7270650090&skn=MyAccessKey&sr=https%3A%2F%2Fnamespace.servicebus.windows.net%2Fqueuename
解决方案
根据 401 错误意味着令牌无效。
使用以下代码生成正确的 SAS 令牌,然后将生成的令牌传递给Authorization标头:
using System;
using System.Globalization;
using System.Security.Cryptography;
using System.Text;
using System.Web;
namespace App1
{
class Program
{
static readonly string queueUrl = "TODO"; // Format: "https://<service bus namespace>.servicebus.windows.net/<queue name>";
static readonly string signatureKeyName = "TODO";
static readonly string signatureKey = "TODO";
static readonly TimeSpan timeToLive = TimeSpan.FromDays(1);
static void Main(string[] args)
{
var token = GetSasToken(queueUrl, signatureKeyName, signatureKey, timeToLive);
Console.WriteLine("Authorization: " + token);
Console.WriteLine("Press any key to exit.");
Console.ReadLine();
}
public static string GetSasToken(string resourceUri, string keyName, string key, TimeSpan ttl)
{
var expiry = GetExpiry(ttl);
string stringToSign = HttpUtility.UrlEncode(resourceUri) + "\n" + expiry;
HMACSHA256 hmac = new HMACSHA256(Encoding.UTF8.GetBytes(key));
var signature = Convert.ToBase64String(hmac.ComputeHash(Encoding.UTF8.GetBytes(stringToSign)));
var sasToken = String.Format(CultureInfo.InvariantCulture, "SharedAccessSignature sr={0}&sig={1}&se={2}&skn={3}",
HttpUtility.UrlEncode(resourceUri), HttpUtility.UrlEncode(signature), expiry, keyName);
return sasToken;
}
private static string GetExpiry(TimeSpan ttl)
{
TimeSpan expirySinceEpoch = DateTime.UtcNow - new DateTime(1970, 1, 1) + ttl;
return Convert.ToString((int)expirySinceEpoch.TotalSeconds);
}
}
}
推荐阅读
- putty - 从 PUTTY 连接到运行 micropython 的 ESP8266
- macos - 使用mac终端在CSV特定列的N位置添加一个字符
- python - 在python中将一个类移动到它自己的文件中
- c++ - 我可以在析构函数中调用公共函数来释放内存吗?
- python - 如何在 Python 中去掉二进制数的左侧?
- kubernetes - Nexus Helm Chart 的配置:HTTPS Serving HTTP Resources
- node.js - 无法读取未定义的属性“编译”。无法启动新的 react-native 项目
- kotlin - Kotlin 是如何专门编译的?
- javascript - 如何通过调用javascript中的函数来重复一个过程
- keycloak - 是否可以在 Keycloak 中使用自定义身份验证逻辑?