使用Service Bus for Windows Server时的客户端身份验证

时间:2014-02-21 08:30:38

标签: authentication servicebus

我目前正在开发一个项目,我们使用Service Bus for Windows Server队列和主题来处理客户端和服务器之间的消息传递。目前我正在研究如何处理客户端的身份验证,并认为我们需要使用SAS。与队列通信的客户端可以使用rest和.net api。我试图找到有关最佳实践的资源,特别是如何处理令牌生成和分发。例如,我们应该为此创建一个服务,调用客户端可以连接到提供访问密钥,然后生成返回给客户端的令牌。非常感谢您的想法和建议。

/感谢

1 个答案:

答案 0 :(得分:4)

我建议使用WindowsTokenProvider和Windows用户帐户。

  1. 首先将有效的Windows用户添加到您的队列/主题的具有发送权限的总线上。 (您可以在代码中或通过服务总线资源管理器执行此操作。)

  2. 然后通过Http 进行Rest API客户端身份验证 - 您需要将有效的UserName / Pwd发布到STS,然后将生成的令牌添加到实际帖子的授权标头中队列。 You can see how to do this here...

  3. 对于TCP上的.Net客户端 - 将您的客户端作为相同的有效Windows用户运行,然后使用TokenProvider.CreateWindowsTokenProvider使用这些隐式凭据调用STS。

  4. 3.1如果您正在为客户端(WCF)使用NetMessagingBinding,请执行以下操作:

            var uri = new Uri(string.Format("https://{0}:9355/ServiceBusDefaultNamespace", serverName));
            var uris = new List<Uri> {uri};
            var securityBehavior = new TransportClientEndpointBehavior
                {
                    TokenProvider = TokenProvider.CreateWindowsTokenProvider(uris)
                };
    
           var endpoint = new ServiceEndpoint(contract, new NetMessagingBinding(), new EndpointAddress(serviceBusEndpointAddress));
            endpoint.Behaviors.Add(securityBehavior);
    

    3.2注意 - 上面的代码将采用当前主体的隐式凭证并将其传递给它们。但是,您可以明确传递这样的凭据:

             var securityBehavior = new TransportClientEndpointBehavior
                {
                    TokenProvider = TokenProvider.CreateWindowsTokenProvider(uris, new NetworkCredential("myUser", "myPassword"))
                };
    

    3.3或者如果你只是使用普通的.NetClient,你可以这样做:

             var uri = new Uri(string.Format("https://{0}:9355/ServiceBusDefaultNamespace", serverName));
             var uris = new List<Uri> {defaultUri};
            var messagingFactorySettings = new MessagingFactorySettings();
            messagingFactorySettings.TokenProvider = 
              TokenProvider.CreateWindowsTokenProvider(uris, new 
              NetworkCredential("myUser", "myPassword"));
              .....
            var factory = MessagingFactory.Create("endpoint", messagingFactorySettings);