authentication - 使用 Windows Server 服务总线时的客户端身份验证

标签 authentication servicebus

我目前正在开发一个项目,我们使用 Windows Server 队列和主题的服务总线来处理客户端和服务器之间的消息传递。目前,我正在研究如何处理客户端身份验证,并认为我们需要使用 SAS。与队列通信的客户端可以使用 REST 和 .NET API。我尝试寻找有关最佳实践的资源,尤其是有关如何处理代币生成和分发的资源。例如,我们应该为此创建一个服务,调用客户端可以连接以提供访问 key ,然后该访问 key 将生成返回给客户端的 token 。意见和建议将不胜感激。

/谢谢

最佳答案

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

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

  2. 然后通过 Http 进行 Rest API 客户端身份验证 - 您需要将有效的用户名/密码发布到 STS,然后将生成的 token 添加到实际发布的授权 header 中队列。 You can see how to do this here...

  3. 对于 TCP 上的 .Net 客户端 - 以同一有效 Windows 用户身份运行客户端,然后使用 TokenProvider.CreateWindowsTokenProvider 使用这些隐式凭据调用 STS。

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);

关于authentication - 使用 Windows Server 服务总线时的客户端身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21929148/

相关文章:

c# - 使用 open id connect server 在 asp.net core 中检索声明

email - 使用 TLS 和普通身份验证将电子邮件发送到 Gmail 的 SMTP 服务器

python - AttributeError at/accounts/login/'User' 对象没有属性 'user'

node.js - 带有 node-jwt-simple 的本地 Passport

azure - 将应用程序功能服务总线触发器切换为 ReceiveAndDelete 模式而不是 PeekLock

python - Azure 服务总线队列发送和接收消息的测试

azure - 用于 EAI 的 Biztalk 与用于 EAI 场景的 ESB

authentication - SSL 究竟如何与非对称算法一起工作?

azure - 未从 azure 服务总线订阅获取所有代理消息

azure - 如何使用 Azure 服务总线分区队列/主题支持 FIFO 消息排序?