当前位置: 首页 > 知识库问答 >
问题:

在Azure Eventhub中发布数据时发生未经授权的错误

穆博简
2023-03-14

我正在使用C#向Azure event hub发送数据。与Eventhub客户端不同,数据将通过http发布。根据需求,我创建了一个嵌入到http头中的SAStoken。但是当我发帖的时候得到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,reasonprace:'unauthorization',version:1.1,content:system.net.http.streamcontent,标头:{transfer-encoding:chunked strict-transport-security:microsoft-httpapi/2.0日期:Sun,2018年6月17日08:35:43 GMT server:microsoft-httpapi/2.0内容-类型:application/xml;charset=UTF-8
}}内容:{system.net.http.streamcontent}标头:{transfer-encoding:chunked

共有1个答案

冯鸿光
2023-03-14

根据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参数需要是您请求的完整请求路径。因此,您需要修改SendDatausInghttp下的相关代码以生成令牌,如下所示:

var sasToken =createSasToken(baseUri+url, SharedAccessKeyName, SharedAccessKey);
 类似资料:
  • 我的数据未发布在postman api中,这会导致以下错误: 单调的节奏。我的主人。com/api/领域:1个职位http://dradiobeats.x10host.com/api/areas401(未授权)核心。js:4002错误HttpErrorResponse 我的app.component.ts 如何解决此错误?

  • 问题内容: 我从Nexus存储库中检出了代码。我更改了帐户密码,并在文件中正确设置了密码。在执行时,我收到错误消息,说明它尝试从该存储库下载文件。 任何想法如何解决此错误?我在Maven 3.04中使用Windows 7 问题答案: 这里的问题是所使用的密码出现错字错误,由于密码中使用了字符/字母,因此很难识别。

  • 我在这里遵循 JWT 夸克指南。我想在不允许用户组访问 API 时发送自定义响应。 这是指南中显示的示例。 我如何知道请求是否未经授权,以便我可以发送自定义响应。

  • 我试图使用Azure发布管道在一个解决方案中发布多个项目 它们都连接到同一Azure订阅,但有些确实部署到给定的应用程序服务,而另一些则给出未经授权的错误。 我已经研究过了,我读到添加website_webdeploy_use_scm到应用程序服务应该有助于未经授权的错误,但这对我没有帮助。 我还能看什么?我通过Azure Devops连接,所以我只是从它自动从Azure收集的列表中选择订阅,因为

  • 有两个ASP.NET核心Web API使用承载令牌身份验证。这些服务还提供静态文件,这些文件用于同意API进入消费应用程序的目录。所以这两个API都在Azure AD中启用了隐式流。 API2使用jwt-barer授权从Web API控制器调用API1。API2具有访问API1的权限。 来自第三个目录的用户导航到API2服务的SPA。用户被重定向到Azure AD,登录并同意API。用户被重定向回