【问题标题】:Unauthorized error when posting data in Azure Eventhub在 Azure Eventhub 中发布数据时出现未经授权的错误
【发布时间】:2018-11-26 10:52:30
【问题描述】:

我正在使用 C# 将数据发送到 Azure 事件中心进行 POC。与 Eventhub 客户端不同,数据将通过 http 发布。根据要求,我创建了一个 SAStoken 以嵌入到 http 标头中。但是,在发布时我得到 501,未经授权的访问错误。不知道我哪里出错了。这是我写的代码

public static async Task<HttpResponseMessage> SendDataUsingHttp()
        {

            // Namespace info.
            var serviceNamespace = "myeventhubs";
            var hubName = "eventhub1";
            var url = string.Format("{0}/publishers/{1}/messages", hubName, 1);
            //var url = string.Format("{0}/messages", hubName);
            var baseUri = new 
             Uri(string.Format("https://{0}.servicebus.windows.net/" 
                          ,  serviceNamespace));
            var SharedAccessKeyName = "All";
            var SharedAccessKey = "<shared access key>";
            var sasToken = 
            createSasToken(baseUri.ToString(),SharedAccessKeyName, 
                           SharedAccessKey);
            var evtData = new
            {
                Temperature = new Random().Next(20, 50)
            };

            var payload = JsonConvert.SerializeObject(evtData);
            // Create client.
            var httpClient = new HttpClient
            {
                BaseAddress = baseUri
            };


            httpClient.DefaultRequestHeaders.Accept.Clear();
            httpClient.DefaultRequestHeaders.Authorization = new 

            System.Net.Http.Headers.AuthenticationHeaderValue   
             ("SharedAccessSignature", sasToken); 

           var content = new StringContent(payload, Encoding.UTF8);
           content.Headers.ContentType = new 
             System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
            HttpResponseMessage result = null;
            try
            {
                result = await httpClient.PostAsync(url, content);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
            return result;
        }

         private static string createSasToken(string baseUri, string keyName, 
         string key)
        {
            TimeSpan sinceEpoch = DateTime.UtcNow - new DateTime(1970, 1, 1);
            var week = 60 * 60 * 24 * 7;
            var expiration = Convert.ToString((int)sinceEpoch.TotalSeconds + 
            week);
            string stringToSign = HttpUtility.UrlEncode(baseUri) + "\n" + 
            expiration;
            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(baseUri), HttpUtility.UrlEncode(signature), 
            expiration, keyName);
            return sasToken;
}

结果

{StatusCode: 401, ReasonPhrase: 'Unauthorized', 版本: 1.1, 内容:System.Net.Http.StreamContent,标题:{ 传输编码:分块严格传输安全: max-age=31536000 日期:2018 年 6 月 17 日星期日 08:35:43 GMT 服务器: Microsoft-HTTPAPI/2.0 内容类型:应用程序/xml;字符集=utf-8
}} 内容:{System.Net.Http.StreamContent} 标头: {传输编码:分块严格传输安全: max-age=31536000 日期:2018 年 6 月 17 日星期日 08:35:43 GMT 服务器: 微软-HTTPAPI/2.0

【问题讨论】:

  • 您可以随时编辑您的问题以添加更多信息,而无需写评论来添加新内容。
  • 您解决了这个问题吗,需要进一步的帮助吗?

标签: c# azure


【解决方案1】:

根据您的createSasToken 方法,它将生成具有以下格式的授权标头值:

Authorization: SharedAccessSignature sr={0}&sig={1}&se={2}&skn={3}

对于您的请求,您还指定以下代码:

System.Net.Http.Headers.AuthenticationHeaderValue("SharedAccessSignature", sasToken); 

使用 Fiddler 捕获网络跟踪,您会发现您发送的请求中的授权标头值如下所示:

Authorization: SharedAccessSignature SharedAccessSignature sr={0}&sig={1}&se={2}&skn={3}

对于您的代码,您需要在createSasToken 方法下调整sasToken 的格式。

此外,createSasToken 方法的baseUri 参数需要是您请求的完整请求路径。所以生成token需要修改SendDataUsingHttp下的相关代码如下:

var sasToken =createSasToken(baseUri+url, SharedAccessKeyName, SharedAccessKey);

【讨论】:

    猜你喜欢
    • 2021-06-19
    • 2018-06-21
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2014-03-08
    • 2020-05-13
    • 1970-01-01
    • 2015-12-21
    相关资源
    最近更新 更多