【发布时间】:2020-01-02 20:26:21
【问题描述】:
我需要在现有服务总线上的应用程序中以编程方式创建/更新和删除共享访问策略。
我可以从 portal.azure.com 很好地做到这一点,但我如何以编程方式做到这一点?有没有这个的休息API?我已经阅读了这个document,但似乎无法让它发挥作用。
任何帮助将不胜感激,谢谢!
【问题讨论】:
标签: c# azure rest azureservicebus
我需要在现有服务总线上的应用程序中以编程方式创建/更新和删除共享访问策略。
我可以从 portal.azure.com 很好地做到这一点,但我如何以编程方式做到这一点?有没有这个的休息API?我已经阅读了这个document,但似乎无法让它发挥作用。
任何帮助将不胜感激,谢谢!
【问题讨论】:
标签: c# azure rest azureservicebus
可以为 Azure 总线服务队列或主题创建共享访问策略。请参阅以下链接以使用 .Net 进行编程实现 https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-sas#generate-a-shared-access-signature-token
【讨论】:
请使用以下代码以编程方式创建共享访问策略。
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;
}
【讨论】: