【问题标题】:Shared Access Policy Programatic Creation for Azure Service BusAzure 服务总线的共享访问策略编程创建
【发布时间】:2020-01-02 20:26:21
【问题描述】:

我需要在现有服务总线上的应用程序中以编程方式创建/更新和删除共享访问策略。

我可以从 portal.azure.com 很好地做到这一点,但我如何以编程方式做到这一点?有没有这个的休息API?我已经阅读了这个document,但似乎无法让它发挥作用。

任何帮助将不胜感激,谢谢!

【问题讨论】:

    标签: c# azure rest azureservicebus


    【解决方案1】:

    可以为 Azure 总线服务队列或主题创建共享访问策略。请参阅以下链接以使用 .Net 进行编程实现 https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-sas#generate-a-shared-access-signature-token

    【讨论】:

    • 谢谢,我想我以前看过那个链接,但我很想知道为什么它们以 'nsm.CreateQueue(qd);' 结尾这是否意味着他们创建队列或使用现有队列?你知道吗?
    • 这意味着他们正在创建一个新队列。您是否检查过 Service bus SDK for SaS
    • 我没有找到任何现有的,我看到了一些例子,但用于创建新的。
    • 您是否检查过 Microsoft.Servicebus.Messaging SDK。在那里您可以找到管理 SAS 的选项
    【解决方案2】:

    请使用以下代码以编程方式创建共享访问策略。

      public async Task<ResourceAuthorizationRule> UpdateAuthorizationRuleForQueueAsync(string connectionString, string queuePath, string RuleName, IList<RuleRequest> RuleRequest)
        {
            ResourceAuthorizationRule _sharedAccessAuthorizationRule = new ResourceAuthorizationRule();
    
            NamespaceManager namespaceManager = NamespaceManager.CreateFromConnectionString(connectionString);
    
            var queue = await namespaceManager.GetQueueAsync(queuePath);
            queue.Authorization.Clear();
    
            int index = connectionString.IndexOf("SharedAccessKeyName=");
            var queueConnectionString = connectionString.Substring(0, index);
    
            foreach (RuleRequest _authorization in RuleRequest)
            {
                var rightList = new List<Microsoft.ServiceBus.Messaging.AccessRights>();
                foreach (var rule in _authorization.Rights)
                {
                    if (rule.Equals(Models.Azure.AccessRights.Manage))
                    {
                        rightList.AddRange(new[]
                            {Microsoft.ServiceBus.Messaging.AccessRights.Manage, Microsoft.ServiceBus.Messaging.AccessRights.Send, Microsoft.ServiceBus.Messaging.AccessRights.Listen});
                        break;
                    }
                    else
                    {
                        if (rule.Equals(Models.Azure.AccessRights.Send))
                        {
                            rightList.Add(Microsoft.ServiceBus.Messaging.AccessRights.Send);
                        }
                        if (rule.Equals(Models.Azure.AccessRights.Listen))
                        {
                            rightList.Add(Microsoft.ServiceBus.Messaging.AccessRights.Listen);
                        }
                    }
                }
                queue.Authorization.Add(new SharedAccessAuthorizationRule(_authorization.RuleName,
                                        _authorization.PrimaryKey ?? SharedAccessAuthorizationRule.GenerateRandomKey(),
                                        _authorization.SecondaryKey ?? SharedAccessAuthorizationRule.GenerateRandomKey(),
                                        rightList));
            }
    
            dynamic result = await namespaceManager.UpdateQueueAsync(queue);
            foreach (var _authorization in result.Authorization)
            {
                _sharedAccessAuthorizationRule.Rights = new List<Models.Azure.AccessRights?>();
                if (_authorization.KeyName == RuleName)
                {
                    _sharedAccessAuthorizationRule.Name = _authorization.KeyName;
                    _sharedAccessAuthorizationRule.PrimaryKey = _authorization.PrimaryKey;
                    _sharedAccessAuthorizationRule.SecondaryKey = _authorization.SecondaryKey;
                    foreach (Models.Azure.AccessRights right in _authorization.Rights)
                    {
                        _sharedAccessAuthorizationRule.Rights.Add(right);
                    }
    
                    _sharedAccessAuthorizationRule.PrimaryConnectionString = queueConnectionString + "SharedAccessKeyName=" + RuleName + ';' + _authorization.ClaimType + '=' + _authorization.PrimaryKey + ";EntityPath=" + queuePath;
                    _sharedAccessAuthorizationRule.SecondaryConnectionString = queueConnectionString + "SharedAccessKeyName=" + RuleName + ';' + _authorization.ClaimType + '=' + _authorization.SecondaryKey + ";EntityPath=" + queuePath;
                }
            }
    
            return _sharedAccessAuthorizationRule;
        }
    

    【讨论】:

    • 谢谢,但同样,这依赖于现有队列我不想在特定队列上执行此操作,我需要它用于服务总线本身(我猜它被称为命名空间?)
    • 现在尝试这样做:docs.azure.cn/en-us/dotnet/api/…
    • 是的,太好了。请尝试。似乎它适用于这个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-31
    • 1970-01-01
    • 2015-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多