WCF分散式安全開發實踐(9):訊息安全模式之Windows身份驗證:Message_Windows_NetTcpBinding

技術小胖子發表於2017-11-07
   今天繼續WCF分散式安全開發實踐(9):訊息安全模式之Windows身份驗證:Message_Windows_NetTcpBinding。本文介紹的內容主要是:主要是訊息安全模式的Windows身份驗證方式,基於NetTcpBinding繫結協議的實現過程。主要內容:基本概念,服務端配置、客戶端配置、總結。   Windows 域驗證的原理在WCF分散式安全開發實踐(4):傳輸安全模式之Windows身份驗證:Transport_Windows_NetTcpBinding 有簡單介紹。  這裡就不在重複。

【1】訊息安全模式之NetTcpBinding客戶端身份驗證:

       訊息安全模式之NetTcpBinding客戶端身份驗證不需要伺服器證書。這裡的客戶端和伺服器的驗證由DC來完成。 這裡使用TCP協議。建議安全上下文以後,使用共享安全上下文對SOAP訊息進行加密和簽名。但是採用Windows身份驗證。也就是客戶端提供Windows域賬號和密碼才可以訪問此服務。
1.身份驗證(伺服器):Windows DC驗證服務身份。 

2.身份驗證(客戶端):客戶端使用Windows域賬戶進行身份驗證
   WCF訊息安全模式之Windows客戶端身份驗證的架構如下:
    客戶端建立TLS安全上下文以後,會使用商定的密碼對訊息簽名,保證資料的安全和機密性,訊息簽名放置被篡改。

   這裡客戶端提供的是有效的Windows域賬號和密碼,進行驗證。伺服器也在Windows域中。不需要證書。新啟用埠8003。
【3】服務端配置:
   伺服器證書配置完成以後,我們來配置服務端相關的檔案,這裡簡單。也可以使用程式碼來完成。

    (1)服務類定義:

    重複使用以前定義的服務類程式碼。 這裡服務類就一個方法就是根據客戶端的呼叫引數name來列印呼叫時間,程式碼如下:
//1.服務契約
    [ServiceContract(Namespace = http://www.cnblogs.com/frank_xl/)]

    
public interface IWCFService

    {

        
//操作契約
        [OperationContract]

        
string SayHello(string name);


    }

    
//2.服務類,繼承介面。實現服務契約定義的操作
    public class WCFService : IWCFService

    {

        
//實現介面定義的方法
        public string SayHello(string name)

        {

            Console.ForegroundColor 
= ConsoleColor.Yellow;

            Console.WriteLine(
Hello! {0},Calling at {1} , name, DateTime.Now.ToLongTimeString());

            
return Hello!  + name;

        }

    }
    (2)訊息安全模式配置:

       使用訊息安全模式,採用客戶端Windows身份驗證策略,Message安全模式下的Windows驗證方式配置資訊如下:
    <bindings>

      
<netTcpBinding>

      
<binding name=BindingConfigration>

        
<security mode=Message>

          
<transport clientCredentialType=None  protectionLevel=None/>

          
<message clientCredentialType=Windows/>

        
</security>

      
</binding>

    
</netTcpBinding>

    
</bindings>


這裡允許啟用安全協商和建立安全上下文。這個配置要應用到服務的終結點配置上。才會生效。

    (3)證書使用:

    這裡不需要使用證書。客戶端和伺服器端都存在於Windows域控制器內,由DC提供驗證。和傳輸安全的Windows驗證一樣。WCF分散式安全開發實踐(4):傳輸安全模式之Windows身份驗證:Transport_Windows_NetTcpBinding 。

    (4)這裡我們不需要使用Tcp傳輸協議,直接配置即可,服務終結點的配置資訊如下:
<service behaviorConfiguration=WCFService.WCFServiceBehavior name=WCFService.WCFService >

        
<endpoint 

          address
=WCFService 

          binding
=netTcpBinding 

          bindingConfiguration
=BindingConfigration

          contract
=WCFService.IWCFService>

          
<identity>

            
<dns value=computer/>

          
</identity>

        
</endpoint>

        
<endpoint address=mex binding=mexTcpBinding contract=IMetadataExchange />

        
<host>

          
<baseAddresses>

            
<add baseAddress=net.tcp://localhost:8003//>

          
</baseAddresses>

        
</host>

      
</service>

    
</services>

    
<behaviors>

      
<serviceBehaviors>

        
<behavior name=WCFService.WCFServiceBehavior>

          
<serviceMetadata httpGetEnabled=false />

          
<serviceDebug includeExceptionDetailInFaults=false />

        
</behavior>

      
</serviceBehaviors>

    
</behaviors>
   我們的服務後設資料終結點使用基地址:net.tcp://localhost:8003/。
【4】客戶端配置:

    這個過程和之前的安全模式新增服務引用的方式一樣,參考WCF分散式安全開發實踐(7):訊息安全模式之匿名客戶端:Message_None_WSHttpBinding, 新增服務的過程一樣。直接引用。
    (1)引用後設資料:

    因為服務的後設資料交換節點啟用了tcp協議,我們在客戶端專案新增後設資料地址net.tcp://localhost:8003/mex查詢服務資訊的時候,介面如下:
  繼續就會新增完畢服務引用。過程和普通的新增服務後設資料引用一樣,會產生客戶端相關程式碼檔案。輸入名稱空間,現在我們點選Ok。等待完成即可。   

    (2)配置檔案:

    客戶端配置檔案使用預設設定,主要是安全模式的設定要如下,與服務端匹配。使用傳輸安全是設定None方式。訊息安全是Windows。程式碼如下:
<system.serviceModel>

        
<bindings>

            
<netTcpBinding>

              
<binding name=NetTcpBinding_IWCFService >

                
<security mode=Message>

                  
<transport clientCredentialType=Windows protectionLevel=EncryptAndSign />

                  
<message clientCredentialType=Windows />

                
</security>

              
</binding>

            
</netTcpBinding>

        
</bindings>

        
<client>

            
<endpoint address=net.tcp://localhost:8003/WCFService binding=netTcpBinding

                bindingConfiguration
=NetTcpBinding_IWCFService contract=ClientProxy.IWCFService

                name
=NetTcpBinding_IWCFService>

                
<identity>

                    
<dns value=computer />

                
</identity>

            
</endpoint>

        
</client>

    
</system.serviceModel>
    (3)測試程式碼:

      我們這裡就直接生成客戶端代理類的例項來呼叫服務進行測試。這裡客戶端在呼叫服務以前,   客戶端要提供Windows賬號和密碼,還有域。然後才能通過客戶端代理來呼叫WCF服務。程式碼如下:
////HTTP WSHttpBinding_IWCFService1
            WCFClient.ClientProxy.WCFServiceClient wcfServiceProxy = new WCFClient.ClientProxy.WCFServiceClient(NetTcpBinding_IWCFService);

            
//通過代理呼叫SayHello服務
            string sName = Frank Xu Lei Messaage Windows NetTcpBinding;

            
string sResult = string.Empty;

            wcfServiceProxy.ClientCredentials.Windows.ClientCredential.UserName 
= FrankXuLei;

            wcfServiceProxy.ClientCredentials.Windows.ClientCredential.Password 
= 00000000;

            wcfServiceProxy.ClientCredentials.Windows.ClientCredential.Domain 
= frankxulei.com;

            sResult 
= wcfServiceProxy.SayHello(sName);

            Console.WriteLine(
Returned Result is {0}, sResult);

            
//For Debug
            Console.WriteLine(Press any key to exit);

            Console.ReadKey();
 (4)測試結果:

   啟動宿主程式,然後啟動客戶端程式,當我們提供了有效的Windows域賬號和密碼的時候,稍作等待,客戶端成功呼叫服務,宿主列印的訊息。如圖:
【5】總結

     Windows Communication Foundation (WCF) 服務和客戶端。WCF安全機制都是依賴現有的安全體系和框架來完成的。Windows Server 2003系統使用域名服務(DNS)查詢定位最近的可用域控制器。該域控制器則會在使用者登入期間對該使用者起首選KDC的作用。如果首選KDC失效,則Windows 2003 Server系統將確定由另一個KDC提供驗證。

   (1)伺服器不需要 X.509 證書,這裡是藉助DC來實現伺服器身份證明。

   (2)繫結設定為 Message 安全模式,客戶端憑據型別設定為 Windows

   (3)初始協商完畢以後,建立共享安全上下文,這裡使用商定的加密演算法對SOAP訊息進行加密和簽名。

   (4)這裡的互操作行僅僅限制在WCF平臺上的客戶端和服務端的安全驗證。

   (5)這裡客戶端呼叫WCF服務以前要提供提供了有效的Windows域賬戶和密碼,和Transport安全模式的Windows方式有差別,這裡使用的是訊息安全,客戶端身份驗證使用的是Windows域伺服器

   (6)參考程式碼:/Files/frank_xl/7.3.WCFServiceSecurityDemoFrankXuLei_Message_Windows_NetTcpBinding.rar

參考文章:
1.WCF分散式安全開發實踐(4):傳輸安全模式之Windows身份驗證:Transport_Windows_NetTcpBinding

2.WCF分散式安全開發實踐(7):訊息安全模式之匿名客戶端:Message_None_WSHttpBinding 

3.http://social.microsoft.com/Forums/zh-CN/wcfzhchs/thread/e1aa7bea-90d8-41e6-b91b-7addba44f8e3

4.WSE3.0構建Web服務安全(2):非對稱加密、公鑰、金鑰、證書、簽名的區別和聯絡以及X.509 證書的獲得和管理,具體5.http://msdn.microsoft.com/en-us/library/ms729709.aspx





 本文轉自 frankxulei 51CTO部落格,原文連結:http://blog.51cto.com/frankxulei/320371,如需轉載請自行聯絡原作者





相關文章