导出 (0) 打印
全部展开

如何将共享访问签名身份验证与 Service Bus 结合使用

注:本页面内容可能不完全适用中国大陆地区运营的 Windows Azure服务。如要了解不同地区 Windows Azure 服务的差异, 请参考本网站.

本部分介绍如何将共享访问签名 (SAS) 身份验证模型与 Windows Azure Service Bus 结合使用。此处显示的示例以 C# 语言编写,并使用 Windows Azure SDK(.NET 版本 2.0)。方案包括授权规则的配置、SAS 令牌的生成以及客户端授权。

有关演示该配置及使用 SAS 授权的完整 Service Bus 应用程序工作示例,请参阅使用 Service Bus 进行共享访问签名身份验证。有关说明如何使用在命名空间上配置的 SAS 授权规则的相关示例或确保 Service Bus 订阅安全的主题,请参阅以下内容:将共享访问签名 (SAS) 身份验证与 Service Bus 订阅结合使用

访问命名空间上的共享访问授权规则

针对 Service Bus 命名空间根执行操作需要证书身份验证。必须上载管理证书方可获得 Windows Azure 订阅。若要上载管理证书,请在 Windows Azure 管理门户的左窗格中单击“设置”。有关 Windows Azure 管理证书的详细信息,请参阅为 Windows Azure 创建管理证书

用于访问 Service Bus 命名空间上的共享访问授权规则的终结点如下:

https://management.core.windows.net/{subscriptionId}/services/ServiceBus/namespaces/{namespace}/AuthorizationRules/

若要在 Service Bus 命名空间上创建 SharedAccessAuthorizationRule 对象,请使用已序列化为 JSON 或 XML 的规则信息在此终结点上执行 POST 操作。例如:

// Base address for accessing authorization rules on a namespace
string baseAddress = @"https://management.core.windows.net/<subscriptionId>/services/ServiceBus/namespaces/<namespace>/AuthorizationRules/";

// Configure authorization rule with base64-encoded 256-bit key and Send rights
var sendRule = new SharedAccessAuthorizationRule("contosoSendAll",
    SharedAccessAuthorizationRule.GenerateRandomKey(),
    new[] { AccessRights.Send });

// Operations on the Service Bus namespace root require certificate authentication.
WebRequestHandler handler = new WebRequestHandler
{
    ClientCertificateOptions = ClientCertificateOption.Manual
};
// Access the management certificate by subject name
handler.ClientCertificates.Add(GetCertificate(<certificateSN>));

HttpClient httpClient = new HttpClient(handler)
{
    BaseAddress = new Uri(baseAddress)
};
httpClient.DefaultRequestHeaders.Accept.Add(
    new MediaTypeWithQualityHeaderValue("application/json"));
httpClient.DefaultRequestHeaders.Add("x-ms-version", "2012-03-01");

// Execute a POST operation on the baseAddress above to create an auth rule
var postResult = httpClient.PostAsJsonAsync("", sendRule).Result;

同样,若要读取命名空间上配置的授权规则,请在终结点上使用 GET 操作。

若要更新或删除特定的授权规则,请使用以下终结点:

https://management.core.windows.net/{subscriptionId}/services/ServiceBus/namespaces/{namespace}/AuthorizationRules/{KeyName}

访问实体上的共享访问授权规则

你可以通过相应 QueueDescriptionTopicDescriptionNotificationHubDescription 对象中的 AuthorizationRules 集合,访问 Service Bus 队列、主题或通知中心上配置的 SharedAccessAuthorizationRule

note注意
Service Bus 通知中心当前只推出了预发行版本,预计在 2013 年中旬过渡到通用版本。有关更多信息,请参见 Service Bus Push Notifications

以下代码说明了如何为队列添加授权规则。

// Create an instance of NamespaceManager for the operation
NamespaceManager nsm = NamespaceManager.CreateFromConnectionString( 
    <connectionString> );
QueueDescription qd = new QueueDescription( <qPath> );

// Create a rule with send rights with keyName as "contosoQSendKey"
// and add it to the queue description.
qd.Authorization.Add(new SharedAccessAuthorizationRule("contosoSendKey", 
    SharedAccessAuthorizationRule.GenerateRandomKey(), 
    new[] { AccessRights.Send }));

// Create a rule with listen rights with keyName as "contosoQListenKey"
// and add it to the queue description.
qd.Authorization.Add(new SharedAccessAuthorizationRule("contosoQListenKey",
    SharedAccessAuthorizationRule.GenerateRandomKey(),
    new[] { AccessRights.Listen }));

// Create a rule with manage rights with keyName as "contosoQManageKey"
// and add it to the queue description.
// A rule with manage rights must also have send and receive rights.
qd.Authorization.Add(new SharedAccessAuthorizationRule("contosoQManageKey",
    SharedAccessAuthorizationRule.GenerateRandomKey(),
    new[] {AccessRights.Manage, AccessRights.Listen, AccessRights.Send }));

// Create the queue.
nsm.CreateQueue(qd);

使用共享访问签名授权

使用 Windows Azure .NET SDK(带有 Service Bus .NET 库)的应用程序可以通过 SharedAccessSignatureTokenProvider 类使用 SAS 授权。以下代码说明了如何使用令牌提供程序向 Service Bus 队列发送消息。

Uri runtimeUri = ServiceBusEnvironment.CreateServiceUri("sb", 
    <serviceNamespace>, string.Empty);
MessagingFactory mf = MessagingFactory.Create(runtimeUri, 
    TokenProvider.CreateSharedAccessSignatureTokenProvider(keyName, key));
QueueClient sendClient = mf.CreateQueueClient(qPath);

//Sending hello message to queue.
BrokeredMessage helloMessage = new BrokeredMessage("Hello, Service Bus!");
helloMessage.MessageId = "SAS-Sample-Message";
sendClient.Send(helloMessage);

应用程序也可以通过在接受连接字符串的方法中使用 SAS 连接字符串,以使用 SAS 进行身份验证。

请注意,若要将 SAS 授权与 Service Bus 中继结合使用,可以使用 Service Bus 命名空间上配置的 SAS 密钥。不久后,我们还将支持在中继上配置 SAS 授权规则。同样,若要将 SAS 授权与 Service Bus 订阅结合使用,可以使用 Service Bus 命名空间或主题上配置的 SAS 密钥。

社区附加资源

显示:
© 2014 Microsoft