身份验证和授权

应用到: Service Bus for Windows Server 1.1

应用程序可以使用共享访问签名 (SAS) 身份验证,或使用 Windows 集成安全性 (Active Directory) 对 Service Bus for Windows Server 进行身份验证。

  • 通过共享访问签名身份验证,应用程序可以使用命名空间或者与特定权限关联的实体上配置的访问密钥对 Service Bus 进行身份验证。然后,你可以使用此密钥生成共享访问签名令牌,而客户端可以使用该令牌对 Service Bus 进行身份验证。

  • Windows 集成安全性提供已加入域的用户和组的值。应用程序可以使用其运行时凭据(或显式使用时的其他凭据)进行身份验证和授权。管理员可以在 Service Bus 命名空间或实体级别定义访问规则。

Service Bus for Windows Server 提供一项简单的 Service Bus 安全令牌服务 (SBSTS)。SBSTS 与 Windows 安全模型集成,并可根据 Windows 标识(存储在本地 Windows 标识存储或 Active Directory 中)或 SAS 机密发布简单 Web 令牌 (SWT)。

SAS 为 Service Bus 提供了简单、灵活且易用的身份验证方案。在无需管理已授权“用户”概念的情况下,应用程序可以使用 SAS。

需要丰富的、基于标识的身份验证模型的应用程序可以使用 Windows 集成安全性通过 Service Bus 进行身份验证。

访问一个 服务命名空间 或 Service Bus for Windows Server 上的实体的客户端的任何操作必须从 SBSTS 获得一个令牌。

note备注
SBSTS 发布的默认令牌生存期为 20 分钟。

note备注
无论你选择哪个身份验证和授权选项,如果你使用自动生成的证书,则必须将根 CA 导入到你的客户端计算机。有关详细信息,请参阅 TechNet 上的 将证书导出到客户端计算机.

有关共享访问签名的详细信息,请参阅Shared Access Signature Authentication with Service Bus

配置 Service Bus 授权

SBSTS 是 Service Bus for Windows Server 网关的组成部分,并在每个 Service Bus for Windows Server 场主机上运行。创建 服务命名空间 时初始化 SBSTS 设置。

Windows 集成安全性配置

可以在 Service Bus for Windows Server 中的两个位置指定授权规则:

  1. 在 Service Bus for Windows Server 服务命名空间 级别,管理员指定在所有基础 Service Bus 消息传送实体(队列、主题和订阅)上拥有管理发送接收权限的用户列表。在服务命名空间的创建期间,你可向一个安全主体(一个用户或一个安全组)授予这些权限,并可在以后使用 PowerShell 命令修改它们。有关详细信息,请参阅 TechNet 上的New-SBNamespaceSet-SBNamespace cmdlet。

  2. 在 Service Bus for Windows Server 消息传送实体水平(队列或主题),您可为该实体指定授权规则。管理规则控制用户是否可管理权限以及创建、更改或删除实体。发送规则控制用户是否可向 Service Bus for Windows Server 实体发送消息,而 接收规则则控制用户是否可从 Service Bus for Windows Server 实体接收消息。要为一个实体配置访问权限,管理员必须配置授权规则。此操作需要服务命名空间上的管理权限。

然后,具有服务命名空间上的管理权限的用户可向服务命名空间中的实体添加授权规则。例如,一旦您创建一个 NamespaceManager 实例,可在创建实体时添加授权规则,或可以在现有实体上修改它们。下面的示例在创建队列时添加授权规则:

// Example of allowing a domain group manage and send permissions to a queue QueueDescription sourceQ = new QueueDescription(sourceQName); string domainGroup = “MyGroup@" + Environment.GetEnvironmentVariable("USERDNSDOMAIN");  AuthorizationRule sourceQRule = new AllowRule("owner", RoleClaimType, domainGroup, new List<string>() {"Manage", "Send" }); sourceQ.Authorization.Add(sourceQRule );  // Example of granting a domain user listen permissions to a queue string domainUser = “MyUserName@" + Environment.GetEnvironmentVariable("USERDNSDOMAIN"); AuthorizationRule ListenRule = new AllowRule("owner", IdentityClaimType, domainUser, new List<string>() { "Listen" }); sourceQ.Authorization.Add(ListenRule); namespaceManager.CreateQueue(sourceQ);

此示例使用两个授权规则创建了一个队列 (sourceQ):授权组 (MYGroup) 管理和发布权限,并授权用户 (MyUserName) 侦听权限。

共享访问签名 (SAS) 配置

共享访问签名规则的作用域可以限定为 Service Bus 命名空间或实体。对于每个实体,你最多可以配置 12 条授权规则。使用 Service Bus SDK API 进行 SAS 规则配置与设置 Windows 集成安全性规则类似。

有关以编程方式设置 SAS 规则的详细信息,请参阅How to use Shared Access Signature Authentication with Service Bus

此外,Service Bus for Windows Server 还支持使用 PowerShell cmdlet 进行 SAS 规则管理。有关详细信息,请参阅 TechNet 上的New-SBAuthorizationRuleSet-SBAuthorizationRuleGet-SBAuthorizationRuleRemove-SBAuthorizationRule cmdlet 的文档。

使用 Microsoft Azure 包进行授权

Microsoft Azure 包为 Service Bus 引入了管理门户,在管理门户中租户可以使用其 Microsoft Azure 包订阅定义新的资源(Service Bus 命名空间和消息实体)。管理门户支持对集成的 Windows 安全性以及 SAS 进行授权管理。你可以对命名空间、队列和主题定义规则。你还可以生成为你创建的规则自定义的连接字符串,然后将这些连接字符串粘贴到应用程序配置文件中。

使用 Service Bus for Windows Server SDK。

通过从 STS 获得一个令牌,可获得对 Service Bus 实体的访问权。默认情况下,Service Bus for Windows Server 中使用的 $STS 侦听端口 9355。

使用 Service Bus for Windows Server 的客户端可创建一个令牌提供商,以使用他们的 NamespaceManagerMessagingFactory 类。例如:

stsUris= new List<Uri>() { new Uri(string.Format(CultureInfo.InvariantCulture,      "sb://{0}:9355/", <hostname>)) }; TokenProvider tokenProvider = TokenProvider.CreateWindowsTokenProvider(stsUris);  string runtimeAddress = string.Format("sb://{0}:9354/{1}/", <hostname>,       <serviceNamespace>); MessagingFactory messagingFactory = MessagingFactory.Create(runtimeAddress,      new MessagingFactorySettings() { TokenProvider = this.tokenProvider,      OperationTimeout = TimeSpan.FromMinutes(30) });

在上一示例中,请将 <hostname> 替换为托管 Service Bus for Windows Server 安装的服务器名称。用您希望访问的 服务命名空间 的名称取代 <serviceNamespace>

使用 MessagingFactory 对象的后续操作自动通过 Microsoft.ServiceBus.TokenProvider 对象获得令牌,并将该令牌包括在所有操作中。此类别也根据令牌到期时间管理令牌缓存和续订。

使用 HTTP

下面的示例介绍从 SBSTS 使用 HTTP 的访问令牌获取,它驻留在 $STS 地址。

public static void Usage() {     string token = GetOAuthAccessToken(new          Uri("https://<hostname.domain.com>:9355/<namespace> /"),          "user@corp.domain. com", "<password>", TimeSpan.FromMinutes(10));  }  public static string GetOAuthAccessToken(Uri namespaceBaseAddress, string userName, string userPassword, TimeSpan timeout) {     const int ServicePointMaxIdleTimeMilliSeconds = 50000;     const string OAuthTokenServicePath = "$STS/OAuth/";     const string ClientPasswordFormat =          "grant_type=authorization_code&client_id={0}&client_secret={1}&scope={2}";      Uri requestUri = new Uri(namespaceBaseAddress, OAuthTokenServicePath);     string requestContent = string.Format(CultureInfo.InvariantCulture,          ClientPasswordFormat, HttpUtility.UrlEncode(userName),          HttpUtility.UrlEncode(userPassword),          HttpUtility.UrlEncode(namespaceBaseAddress.AbsoluteUri));     byte[] body = Encoding.UTF8.GetBytes(requestContent);      HttpWebRequest request = WebRequest.Create(requestUri) as HttpWebRequest;     request.ServicePoint.MaxIdleTime = ServicePointMaxIdleTimeMilliSeconds;     request.AllowAutoRedirect = true;     request.MaximumAutomaticRedirections = 1;     request.Method = "POST";     request.ContentType = "application/x-www-form-urlencoded";     request.ContentLength = body.Length;     request.Timeout = Convert.ToInt32(timeout.TotalMilliseconds,          CultureInfo.InvariantCulture);      using (Stream requestStream = request.GetRequestStream())     {         requestStream.Write(body, 0, body.Length);     }      string rawAccessToken = null;     using (var response = request.GetResponse() as HttpWebResponse)     {         using (Stream stream = response.GetResponseStream())         {             using (var reader = new StreamReader(stream, Encoding.UTF8))             {                 rawAccessToken = reader.ReadToEnd();             }         }     }      string simpleWebToken = string.Format(CultureInfo.InvariantCulture,          "WRAP access_token=\"{0}\"", rawAccessToken);     return simpleWebToken; }

本例中,您可用所示格式替代 hostnamenamespaceusername 值。

在发往 Service Bus for Windows Server 的后续消息中,客户端可将 HTTP 授权标头设置为前一示例中通过调用 GetOAuthAccessToken() 方法获得的令牌。

note备注
使用 HTTP 的客户端负责根据令牌到期时间管理令牌缓存和续订。