【问题标题】:How to solve Authorization error (401) in Azure Event Hubs using SAS?如何使用 SAS 解决 Azure 事件中心中的授权错误 (401)?
【发布时间】:2022-08-24 14:01:57
【问题描述】:

我正在尝试使用以下代码向 Azure 事件中心发送消息:

    var producer = new EventHubProducerClient(
            ConfigurationManager.AppSettings[\"EventHubConnectionString\"],
            ConfigurationManager.AppSettings[\"EventHubName\"]
        );

SAS 密钥(连接字符串)是正确的,它位于实例级别(不是命名空间),这是 Azure.Messaging.EventHubs.Producer 库所要求的(但我都尝试了), 不幸的是,它返回以下错误:

---> System.Net.WebException: The remote server returned an error: (401) Unauthorized.

   at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
   at System.Net.WebRequest.<>c.<GetResponseAsync>b__68_2(IAsyncResult iar)
   at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)...
  • 这似乎不是事件中心错误。事件中心没有 HTTP 堆栈,客户端完全基于 AMQP。还值得注意的是,客户端会懒惰地建立连接;如果您在该 sn-p 中看到它,则表明配置系统中正在发生某些事情。

标签: c# azure events azure-eventhub


【解决方案1】:

感谢@Jesse Squire 提出错误的根本原因.

这似乎不是事件中心错误。事件中心没有 HTTP 堆栈,客户端完全基于 AMQP。还值得注意的是,客户端会懒惰地建立连接;如果您在该 sn-p 中看到它,则表明配置系统中正在发生某些事情。

如果有助于解决问题,请检查以下步骤

如本文所述Microsoft DocEventHubProducerClient 类, 有多种方法用于创建EventHubProducerClient,其中包括您尝试过的方法,例如事件中心实例 SAS 连接字符串、事件中心命名空间 SAS 连接字符串,另一种是使用具有完整命名空间 URL 的凭据对象。 上面的 URL 包含配置以将事件发送到事件中心的代码示例。

我在阅读使用 SAS 的 Azure 事件中心身份验证时遇到的最佳实践/建议之一是:

Microsoft 建议您尽可能使用 Azure AD 凭据作为安全最佳实践,而不是使用更容易受到破坏的共享访问签名。虽然您可以继续使用共享访问签名 (SAS) 来授予对事件中心资源的细粒度访问权限,但 Azure AD 提供了类似的功能,而无需管理 SAS 令牌或担心撤销受损的 SAS。

请参阅此MS Doc,其中包含从 SAS 策略生成到从头开始代码配置的配置步骤。

【讨论】:

    猜你喜欢
    • 2020-01-24
    • 2019-08-23
    • 2022-10-15
    • 1970-01-01
    • 2020-09-17
    • 2022-01-07
    • 2017-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多