天天看點

WCF分布式安全開發實踐(7):消息安全模式之匿名用戶端:Message_None_WSHttpBinding

  今天會進入WCF分布式安全開發實作的另一部分内容的學習:WCF消息安全模式。今天就是WCF分布式安全開發實踐(7):消息安全模式之匿名用戶端:Message_None_WSHttpBinding 。本文介紹的内容主要是:主要是消息安全模式的匿名用戶端身份驗證方式,基于WSHttpBinding綁定協定的實作過程。主要内容:基本概念,然後是制作證書、服務端配置、用戶端配置、總結。     

【0】消息安全模式之匿名用戶端身份驗證:

       消息安全模式之匿名用戶端身份驗證需要伺服器需要一個有效的可用于TLS 加密和向用戶端驗證服務身份的 X.509 證書,并且用戶端必須信任此伺服器證書。 這裡使用http協定。建議安全上下文以後,使用共享安全上下文對SOAP消息進行加密和簽名。但是不采用任何用戶端身份驗證。也就是任何用戶端都可以通路此服務。

1.身份驗證(伺服器):提供證書,(使用 HTTP)用于初始會話協商和證明服務身份。 

2.身份驗證(用戶端):不需要提供憑據,None

   WCF消息安全模式之匿名用戶端身份驗證的架構如下:

    用戶端建立TLS安全上下文以後,會使用商定的密碼對消息簽名,用戶端使用證書加密資料,服務端使用證書解密資料,保證資料的安全和機密性,消息簽名放置被篡改。

   下面是制作證書的過程,和傳輸安全模式的過程一樣,這裡直接使用相同證書制作工具,新啟用端口8001。

【1】制作證書:

(1)使用makecert 工具:Microsoft Visual Studio 2008-->Visual Studio Tools-->Visual Studio 2008 指令提示行。

輸入:makecert -sr localmachine -ss My -n CN=WCFServerPK -sky exchange -pe -r

輸入:makecert -sr localmachine -ss My -n CN=WCFClientPK -sky exchange -pe -r。

-這裡制作了連個證書,主要隻使用一個WCFServerPK,可以到出密鑰檔案pfx,後續我們要導入到其他存儲區,設定為信任的證書。WCFClientPK -是為以後文章準備的,也是可以設定為信任的證書。

 (2) 打開浏覽器---->Internet 選項----->内容----->證書----->個人,預設是儲存到目前使用者CurrentUser,你會看到剛才制作的證書。這個可以檢視部分證書,但是功能有限。我們還是使用控制台證書管理工具。

 (3)使用MMC建立證書控制單元檢視證書的資訊:

  開始--運作--MMC--控制台--添加删除單元--證書--目前使用者和計算機各添加一個。能檢視和管理CurrentUser和LocalMachine的證書。如圖:

(4)導入證書到信任的人和信任的CA機構裡。步驟如下:

    1.導出證書檔案,帶密鑰的pfx檔案。使用mmc,儲存到桌面位置(友善查找)。這裡記住你制作證書的密碼。要使用。

    2.導入證書到信任的人。使用任務-導入向導--選擇證書檔案,導入即可。

    3.導入證書到信任的機構,使用任務-導入向導--選擇證書檔案,導入即可。這個證書就被信任了。

【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.WriteLine("Hello! {0},Calling at {1} 

WCF分布式安全開發實踐(7):消息安全模式之匿名用戶端:Message_None_WSHttpBinding

", name,DateTime.Now.ToLongTimeString());

            return "Hello! " + name;

        }

    (2)消息安全模式配置:

       使用消息安全模式,采用用戶端None身份驗證政策,Message安全模式下的使用者匿名驗證方式配置資訊如下:

    <wsHttpBinding>

      <binding name="BindingConfigration">

        <security mode="Message">

          <transport clientCredentialType="None"/>

          <message clientCredentialType="None" negotiateServiceCredential="true" establishSecurityContext="true"/>

        </security>

      </binding>

    </wsHttpBinding>

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

    (3)證書使用:

    在服務行為節點屬性裡配置使用證書WCFServerPK,其它設定采用預設方式。配置如下:

behaviors>

      <serviceBehaviors>

        <behavior name="WCFService.WCFServiceBehavior">

          <serviceMetadata httpGetEnabled="true" />

          <serviceDebug includeExceptionDetailInFaults="false" />

          <serviceCredentials>

              <serviceCertificate  storeName="My"  x509FindType="FindBySubjectName" findValue="WCFServerPK" storeLocation="LocalMachine"/>

          </serviceCredentials>

        </behavior>

      </serviceBehaviors>

    </behaviors>

    <bindings>

    這裡指定了服務端證書的查找位置和查找條件,我們證書存儲在LocalMachine 個人區域。使用标題進行查找。如果相同标題,需要制定唯一的查找條件。保證查找證書的唯一性。否則會出異常。

   (4)這裡我們不需要使用Https傳輸協定,直接使用http協定即可,服務終結點的配置資訊如下:

    <services>

      <service behaviorConfiguration="WCFService.WCFServiceBehavior" name="WCFService.WCFService" >

        <endpoint 

          address="WCFService" 

          binding="wsHttpBinding" 

          bindingConfiguration="BindingConfigration"

          contract="WCFService.IWCFService">

        </endpoint>

        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />

        <host>

          <baseAddresses>

            <add baseAddress="http://localhost:8001/"/>

          </baseAddresses>

        </host>

      </service>

    </services>

【4】用戶端配置:

    這個過程和之前的傳輸安全模式下,添加服務的過程一樣。直接引用。

    (1)引用中繼資料:

   繼續就會添加完畢服務引用。過程和普通的添加服務中繼資料引用一樣,會産生用戶端相關代碼檔案。輸入命名空間,現在我們點選Ok。等待完成即可。   

    (2)配置檔案:

    用戶端配置檔案使用預設設定,主要是安全模式的設定要如下,與服務端比對。使用None方式。

                    <security mode="Message">

                        <transport clientCredentialType="Windows" proxyCredentialType="None"

                            realm="" />

                        <message clientCredentialType="None" negotiateServiceCredential="true"

                            algorithmSuite="Default" establishSecurityContext="true" />

                    </security>

    (3)測試代碼:

      等待代碼生成結束,我們這裡就直接生成用戶端代理類的執行個體來調用服務進行測試。這裡用戶端在調用服務以前,必須信任證書,這裡我們使用了一段通用的代碼,來建立TLS使用。這裡會信任伺服器的證書。代碼如下:

 public static class Util

        /// <summary>

        /// Sets the cert policy.

        /// </summary>

        public static void SetCertificatePolicy()

            ServicePointManager.ServerCertificateValidationCallback

                       += RemoteCertificateValidate;

        /// Remotes the certificate validate.

        private static bool RemoteCertificateValidate(

           object sender, X509Certificate cert,

            X509Chain chain, SslPolicyErrors error)

            // trust any certificate!!!

            System.Console.WriteLine("Warning, trust any certificate");

            return true;

   用戶端測試代碼很簡單,就是通過用戶端代理來調用WCF服務。代碼如下:

 class WCFClientTest

        static void Main(string[] args)

            try

            {

                //HTTP WSHttpBinding_IWCFService1

                WCFClient.ClientProxy.WCFServiceClient wcfServiceProxyHttp = new WCFClient.ClientProxy.WCFServiceClient("WSHttpBinding_IWCFService");

                //通過代理調用SayHello服務

                string sName = "Frank Xu Lei  Message None WSHttpBinding";

                string sResult = string.Empty;

                Util.SetCertificatePolicy();

                sResult = wcfServiceProxyHttp.SayHello(sName);

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

            }

            catch (Exception e)

               Console.WriteLine("Exception : {0}", e.Message);

            //For Debug

            Console.WriteLine("Press any key to exit");

            Console.Read();

 (4)測試結果:

   啟動宿主程式,然後啟動用戶端程式,稍作等待。用戶端成功調用服務,宿主列印的消息。如圖:

【5】總結

     Windows Communication Foundation (WCF) 服務和用戶端。WCF安全機制都是依賴現有的安全體系和架構來完成的。

   (1)伺服器需要一個證明伺服器身份和有效的可用于TLS傳輸層安全的 X.509 證書,并且用戶端必須信任此伺服器證書。

   (2)用戶端送出證書的方式與傳輸安全之證書驗證方式一樣,伺服器端需要提供證書,但是不需要httpcfg.exe設定。

   (3)初始協商需要伺服器證書來建立TLS連接配接,協商完畢以後,建立共享安全上下文,這裡使用商定的加密算法對SOAP消息進行加密和簽名。

   (4)如果你啟用協商,而不把伺服器證書在用戶端設定信任,導入信任的辦法機構,會出現SOAP安全協商失敗的異常。

   (5)給出今天的參考代碼,供大家參考:

   以上基本是消息安全之匿名用戶端驗證方式的實作過程。消息安全提供了更加靈活的安全加密政策,使得我們用戶端和伺服器之間可以經過多個中間件,依然能夠保證消息的機密性和完整性。也就是端到端(End-to-End)的安全機制。

  希望大家的學習有幫助~

參考文章:

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

繼續閱讀