我目前正在开发一个项目,我们使用 Windows Server 队列和主题的服务总线来处理客户端和服务器之间的消息传递。目前,我正在研究如何处理客户端身份验证,并认为我们需要使用 SAS。与队列通信的客户端可以使用 REST 和 .NET API。我尝试寻找有关最佳实践的资源,尤其是有关如何处理代币生成和分发的资源。例如,我们应该为此创建一个服务,调用客户端可以连接以提供访问 key ,然后该访问 key 将生成返回给客户端的 token 。意见和建议将不胜感激。
/谢谢
最佳答案
我建议使用 WindowsTokenProvider 和 Windows 用户帐户。
首先将一个有效的 Windows 用户添加到总线,并对您的队列/主题具有发送权限。 (您可以通过代码或通过服务总线资源管理器执行此操作。)
然后通过 Http 进行 Rest API 客户端身份验证 - 您需要将有效的用户名/密码发布到 STS,然后将生成的 token 添加到实际发布的授权 header 中队列。 You can see how to do this here...
对于 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/