我目前正在开发一个项目,我们使用Service Bus for Windows Server队列和主题来处理客户端和服务器之间的消息传递。目前我正在研究如何处理客户端的身份验证,并认为我们需要使用SAS。与队列通信的客户端可以使用rest和.net api。我试图找到有关最佳实践的资源,特别是如何处理令牌生成和分发。例如,我们应该为此创建一个服务,调用客户端可以连接到提供访问密钥,然后生成返回给客户端的令牌。非常感谢您的想法和建议。
/感谢
答案 0 :(得分:4)
我建议使用WindowsTokenProvider和Windows用户帐户。
首先将有效的Windows用户添加到您的队列/主题的具有发送权限的总线上。 (您可以在代码中或通过服务总线资源管理器执行此操作。)
然后通过Http 进行Rest API客户端身份验证 - 您需要将有效的UserName / Pwd发布到STS,然后将生成的令牌添加到实际帖子的授权标头中队列。 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);