2014-02-21 125 views
2

我目前正在使用服務總線作爲Windows Server隊列和主題處理客戶端與服務器之間的消息傳遞的項目。目前我正在研究如何處理客戶端的身份驗證,並相信我們需要使用SAS。與隊列通信的客戶端可以同時使用rest和.net api。我試圖找到有關如何處理令牌生成和分發的最佳實踐的資源。例如,我們應該爲此創建一個服務,以便呼叫客戶端可以連接到提供訪問密鑰,然後生成一個返回給客戶端的令牌。想法和建議將不勝感激。爲Windows服務器使用服務總線時的客戶端身份驗證

/感謝

回答

4

我會建議使用WindowsTokenProvider和Windows用戶帳戶。

  1. 首先將有效的Windows用戶添加到您的隊列/主題上的總線發送權限。爲REST API客戶端身份驗證通過HTTP(您可以在代碼中或通過服務總線探險做到這一點。)

  2. 那麼 - 你需要一個有效的用戶名/密碼後轉移到STS然後將得到的權杖加實際發佈到隊列的授權標頭。 You can see how to do this here...

  3. 爲.NET客戶端通過TCP - 運行客戶端一樣有效的Windows用戶,然後調用STS與使用TokenProvider.CreateWindowsTokenProvider這些隱含的憑據。

3.1如果您使用的是NetMessagingBinding爲您的客戶(WCF),然後進行以下操作:

 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 NB - 上面的代碼將當前主體的隱式證書,並通過他們跨越。但是,可以明確地傳遞憑據是這樣的:

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

對不起,我沒有說清楚在我最初的問題。我確實相信我們能夠爲某些客戶使用Windows集成安全性,併爲此感謝很多答案。但是,對於像我們無法使用Windows帳戶的第三方CRM系統一樣使用SAS的客戶,是否有任何最佳做法或建議? – mstrand

+0

對不起,我以前沒用過sas。聽起來就像你在中途的一半!如果它有用的話,免費提供我的答案;-)。 – jonho

相關問題