<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      [WCF安全系列]談?wù)刉CF的客戶端認證[用戶名/密碼認證]

      對于基于Internet的應(yīng)用,基于用戶名和密碼的認證方式是最為常用的,而WCF為你提供了不同模式的用戶名認證方式。首先還是從用戶憑證的表示說起。

      一、用戶名/密碼認證的三種模式

      基于用戶名/密碼的用戶憑證通過類型UserNamePasswordClientCredential表示。而在ClientCredentials中,只讀屬性UserName表示這樣一個用戶憑證。你可以按照Windows憑證的方式為ChannelFactory<TChannel>或者ClientBase<TChannel>基于用戶名/密碼憑證。

         1: public class ClientCredentials
         2: {
         3:      //其他成員
         4:      public UserNamePasswordClientCredential UserName { get; }
         5: } 
         6: public sealed class UserNamePasswordClientCredential
         7: {
         8:     //其他成員
         9:     public string Password {get; set; }
        10:     public string UserName { get; set; }
        11: }

      用戶名/密碼憑證在客戶端的設(shè)置很容易,但是我們關(guān)心的是服務(wù)端采用怎樣的機制來驗證這個憑證。WCF為你提供了如下三種方式來驗證憑證中用戶名是否和密碼相符:

      • Windows:將用戶名和密碼映射為Windows帳號和密碼,采用Windows認證;
      • MembershipProvider:利用配置的MembershipProvider驗證用戶名和密碼;
      • 自定義:通過繼承抽象類UsernamePasswordValidator,自定義用戶名/密碼驗證器進行驗證。

      WCF通過枚舉UserNamePasswordValidationMode定了上述三種用戶名/密碼認證模式。該枚舉定義如下,其中Windows是默認選項。

         1: public enum UserNamePasswordValidationMode
         2: {
         3:     Windows,
         4:     MembershipProvider,
         5:     Custom
         6: }

      上述三種認證模式的設(shè)置最終通過之前提到過的ServiceCredentials這一服務(wù)行為進行設(shè)置的。從下面的定義我們可以看出,ServiceCredentials定義了只讀屬性UserNameAuthentication用于基于用戶名/密碼認證的相關(guān)設(shè)置。屬性的類型為UserNamePasswordServiceCredential,定義其中的UserNamePasswordValidationMode屬性表示采用的認證模式。如果選擇了需要通過屬性MembershipProvider設(shè)置采用的MembershipProvider。如果選擇了Custom,則需要通過CustomUserNamePasswordValidator屬性指定你自定義的UserNamePasswordValidator對象。

         1: public class ServiceCredentials: SecurityCredentialsManager, IServiceBehavior
         2: {
         3:     //其他成員
         4:      public UserNamePasswordServiceCredential UserNameAuthentication { get; }
         5: }
         6: public sealed class UserNamePasswordServiceCredential
         7: {
         8:     //其他成員
         9:     public UserNamePasswordValidator CustomUserNamePasswordValidator { get; set; }
        10:     public MembershipProvider MembershipProvider { get; set; }
        11:     public UserNamePasswordValidationMode UserNamePasswordValidationMode { get; set; }
        12: }

      接下來我們通過實例演示的方式來如何通過MembershipProvider進行基于用戶名/密碼認證,而對于自定義UserNamePasswordValidator的實例我會在介紹安全會話的時候進行演示。

      二、實例演示:通過MembershipProvider進行用戶名/密碼的認證

      Membership是ASP.NET中一個重要的模塊,旨在進行基于用戶名/密碼的認證和對應(yīng)的帳號管理。Membership采用策略設(shè)計模式,所有的API通過幾個靜態(tài)Membership類暴露出來,而相應(yīng)的功能實現(xiàn)在具體的Membership提供者中。所有的提供者繼承自同一個抽象類MembershipProvider。ASP.NET提供了兩種類型的提供者:SqlMembershipProviderActiveDirectoryMembershipProvider。前者將用戶存儲于SQL Server數(shù)據(jù)庫中,而后者則直接建立在AD之上,本實例采用SqlMembershipProvider,在前面一個實例演示中,我們創(chuàng)建了以計算服務(wù)為場景的解決方案,現(xiàn)在我們直接沿用它。

      我們首要的任務(wù)是在用于存儲帳戶信息的SQL Server數(shù)據(jù)庫,為此你可以先在本地SQL Server創(chuàng)建一個空的數(shù)據(jù)庫(假設(shè)起名為AspNetDb)。你接著需要在該數(shù)據(jù)庫中創(chuàng)建SqlMembershipProvider所需的數(shù)據(jù)表和相應(yīng)的存儲過程。這些數(shù)據(jù)庫對象的創(chuàng)建,需要借助aspnet_regsql.exe這個工具。你只需要以命令行的方式執(zhí)行如下aspnet_regsql.exe(無需任何參數(shù)),相應(yīng)的向?qū)Ь蜁霈F(xiàn)。

      在向?qū)棾龅那皟蓚€窗體中保持默認設(shè)置,直接點擊“下一步”后,會出現(xiàn)一個數(shù)據(jù)庫選擇窗體。此時你需要選擇我們剛剛創(chuàng)建的數(shù)據(jù)庫,點擊“確認”后,相關(guān)的數(shù)據(jù)庫對象會為你創(chuàng)建出來。

      這些創(chuàng)建出來的數(shù)據(jù)表可以同時服務(wù)于多個應(yīng)用,所有每一個表中都具有一個名稱為ApplicationId的字段來明確該條記錄對應(yīng)的應(yīng)用。而所有應(yīng)用記錄維護在aspnet_Applications這么一個表中。現(xiàn)在我們需要通過執(zhí)行下面一段SQL腳本在該表中添加一條表示我們應(yīng)用的記錄。我們應(yīng)用起名為MembershipAuthenticationDemo。

         1: INSERT INTO [aspnet_Applications]
         2:            ([ApplicationName]
         3:            ,[LoweredApplicationName]
         4:            ,[ApplicationId]
         5:            ,[Description])
         6: VALUES
         7:            (
         8:              'MembershipAuthenticationDemo'
         9:              ,'membershipauthenticationdemo'
        10:              ,NEWID()
        11:              ,''
        12:         )

      現(xiàn)在數(shù)據(jù)庫方面已經(jīng)準備就緒,我們接著來完成編程和配置方面的工作。我們不打算從新創(chuàng)建一個解決方案,而是直接對之前演示的實例進行改造。我們采用自我寄宿的方式,由于Membership隸屬于ASP.NET,所以我們需要添加System.Web.dll的引用,如果你采用的是.NET Frameowrk 4.0(本例所示的配置也是基于該版本),你還需額外添加對System.Web.ApplicationServices.dll的引用。接下來,我們需要在服務(wù)寄宿方面所做的工作就是將下面一段配置整個拷貝到app.config中。

         1: <?xml version="1.0"?>
         2: <configuration>
         3:   <connectionStrings>
         4:     <add name="AspNetDb" connectionString="Server=.; Database=AspNetDb; Uid=sa; Pwd=password"/>
         5:   </connectionStrings>
         6:   <system.web>
         7:     <membership defaultProvider="myProvider">
         8:       <providers>
         9:         <add name="myProvider" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" 
        10:              connectionStringName="AspNetDb" applicationName="MembershipAuthenticationDemo" requiresQuestionAndAnswer="false"/>
        11:       </providers>
        12:     </membership>
        13:   </system.web>
        14: <system.serviceModel>
        15:   <bindings>
        16:     <ws2007HttpBinding>
        17:       <binding name="userNameCredentialBinding">
        18:         <security mode="Message">
        19:           <message clientCredentialType="UserName"/>
        20:         </security>
        21:       </binding>
        22:     </ws2007HttpBinding>
        23:   </bindings>
        24:   <services>
        25:     <service name="Artech.WcfServices.Services.CalculatorService" behaviorConfiguration="membershipAuthentication">
        26:       <endpoint address="http://127.0.0.1/calculatorservice" binding="ws2007HttpBinding" bindingConfiguration="userNameCredentialBinding" contract="Artech.WcfServices.Contracts.ICalculator"/>
        27:     </service>
        28:   </services>
        29:   <behaviors>
        30:     <serviceBehaviors>
        31:       <behavior  name="membershipAuthentication">
        32:         <serviceCredentials>
        33:           <serviceCertificate storeLocation="LocalMachine" storeName ="My" x509FindType="FindBySubjectName" findValue="Jinnan-PC"/>
        34:           <userNameAuthentication userNamePasswordValidationMode="MembershipProvider" membershipProviderName="myProvider"/>
        35:         </serviceCredentials>
        36:       </behavior>
        37:     </serviceBehaviors>
        38:   </behaviors>
        39:   </system.serviceModel>
        40: </configuration>

      考慮到有些人可能對ASP.NET下的Membership相關(guān)配置不太了解,在這里我對上述這段配置進行以下簡單的說明。

      • 配置名稱為AspNetDb的連接字符串連接的是我們剛剛創(chuàng)建的數(shù)據(jù)庫,并通過aspnet_regsql.exe工具在該數(shù)據(jù)庫中創(chuàng)建了所需的數(shù)據(jù)庫對象;
      • 表示Membership配置節(jié)的<system.web>/<membership>節(jié)點下配置了唯一的SqlMembershipProvider,配置名稱為myProvider。上面配置的連接字符創(chuàng)名稱AspNetDb配置在connectionStringName屬性中,意味著該SqlMembershipProvider會將我們創(chuàng)建的數(shù)據(jù)庫作為用戶帳號存儲;
      • 服務(wù)終結(jié)點采用WS2007HttpBinding,采用Message安全模式,客戶端憑證類型被設(shè)置為UserName
      • 服務(wù)應(yīng)用了一個配置名稱為membershipAuthentication的服務(wù)行為,該行為中通過<serviceCertificate>節(jié)點設(shè)置了服務(wù)證書。在表示用戶名/密碼認證配置的<userNameAuthentication>節(jié)點中,將認證模式設(shè)置成MembershipProvider,而membershipProviderName屬性的值為我們在<system.web>/<membership>中設(shè)置的MembershipProvider的名稱。

      到目前為止,在我們創(chuàng)建的數(shù)據(jù)庫中并沒有用戶帳戶記錄。為了演示認證的效果,我們必須創(chuàng)建相關(guān)用戶帳戶記錄。為了省事,我直接將相關(guān)的代碼寫在了服務(wù)寄宿的代碼中。如下面的代碼片斷所示,在對服務(wù)進行寄宿之前,我通過調(diào)用Membership的靜態(tài)方法CreateUser創(chuàng)建了一個用戶名、密碼和Email分別為Zhansan、Pass@word和zhanshan@gmail.com的帳號。

         1: if (Membership.FindUsersByName("Zhansan").Count == 0)
         2: {
         3:     Membership.CreateUser("Zhansan", "Pass@word", "zhanshan@gmail.com");
         4: }
         5: using (ServiceHost host = new ServiceHost(typeof(CalculatorService)))
         6: {
         7:     host.Open();
         8:     Console.Read();
         9: }

      接下來我們需要對客戶端的配置進行相應(yīng)的調(diào)整,整個配置內(nèi)容如下面的XML片斷所示。對于這段配置有一點需要注意的是:終結(jié)點應(yīng)用了一個名稱為peerTrustSvcCertValidation的行為,該行為中將服務(wù)證書認證模式設(shè)置成PeerTrust,所以你需要通過MMC證書管理單元的導(dǎo)出/導(dǎo)入功能將Jinnan-PC證書導(dǎo)入到“受信任人(Trusted People)”存儲區(qū)

         1: <?xml version="1.0"?>
         2: <configuration>
         3:   <system.serviceModel>
         4:     <bindings>
         5:       <ws2007HttpBinding>
         6:         <binding name="userNameCredentialBinding">
         7:           <security mode="Message">
         8:             <message clientCredentialType="UserName"/>
         9:           </security>
        10:         </binding>
        11:       </ws2007HttpBinding>
        12:     </bindings>
        13:     <client>
        14:       <endpoint name="calculatorService" behaviorConfiguration="peerTrustSvcCertValidation"  address="http://127.0.0.1/calculatorservice" binding="ws2007HttpBinding" bindingConfiguration="userNameCredentialBinding" contract="Artech.WcfServices.Contracts.ICalculator">
        15:         <identity>
        16:           <certificateReference storeLocation="LocalMachine" storeName ="My" x509FindType="FindBySubjectName" findValue="Jinnan-PC"/>
        17:         </identity>
        18:       </endpoint>
        19:     </client>
        20:     <behaviors>
        21:       <endpointBehaviors>
        22:         <behavior name="peerTrustSvcCertValidation">
        23:           <clientCredentials>
        24:             <serviceCertificate>
        25:               <authentication certificateValidationMode="PeerTrust"/>
        26:             </serviceCertificate>
        27:           </clientCredentials>
        28:         </behavior>
        29:       </endpointBehaviors>
        30:     </behaviors>
        31:   </system.serviceModel>
        32: </configuration>

      最后,我么來編寫如下一段客戶端進行服務(wù)調(diào)用的程序。在下面的代碼中,我進行了兩次服務(wù)調(diào)用。但是創(chuàng)建服務(wù)代理對象的ChannelFactory<ICalculator>被設(shè)置了不同的用戶名憑證。其中第一個是正確的用戶名和密碼,后一個卻指定了一個根本不存在的用戶名。

         1: using (ChannelFactory<ICalculator> channelFactory = new ChannelFactory<ICalculator>("calculatorService"))
         2: {
         3:     UserNamePasswordClientCredential credential = channelFactory.Credentials.UserName;
         4:     credential.UserName     = "Zhansan";
         5:     credential.Password     = "Pass@word";
         6:     ICalculator calculator  = channelFactory.CreateChannel();
         7:     calculator.Add(1, 2);
         8:     Console.WriteLine("服務(wù)調(diào)用成功...");
         9: }
        10: using (ChannelFactory<ICalculator> channelFactory = new ChannelFactory<ICalculator>("calculatorService"))
        11: {
        12:     UserNamePasswordClientCredential credential = channelFactory.Credentials.UserName;
        13:     credential.UserName     = "lisi";
        14:     credential.Password     = "Pass@word";
        15:     ICalculator calculator  = channelFactory.CreateChannel();
        16:     try
        17:     {
        18:         calculator.Add(1, 2);
        19:     }
        20:     catch
        21:     {
        22:         Console.WriteLine("服務(wù)調(diào)用失敗...");
        23:     }
        24: }

      輸出結(jié)果:

         1: 服務(wù)調(diào)用成功...
         2: 服務(wù)調(diào)用失敗...
      posted @ 2011-06-13 21:13  Artech  閱讀(16188)  評論(16)    收藏  舉報
      主站蜘蛛池模板: 国产精品亚洲av三区色| 色爱综合另类图片av| 日韩有码中文字幕国产| 巨熟乳波霸若妻在线播放| 国产精品99区一区二区三| 精品综合久久久久久98| 国产精品视频第一第二区| 国产精品高清国产三级囯产AV| 中文字幕精品人妻丝袜| 男女性高爱潮免费网站| 午夜福利影院不卡影院| 重口SM一区二区三区视频| 百色市| 福利一区二区不卡国产| 人人人爽人人爽人人av| 国产AV福利第一精品| 高潮精品熟妇一区二区三区| 日韩精品国产二区三区| 最新精品国偷自产在线美女足| 日本老熟女一二三区视频| 国产无套精品一区二区| 日本边添边摸边做边爱喷水| 国产一区二区日韩经典| 河东区| 欧美亚洲h在线一区二区| 俄罗斯少妇性XXXX另类| 亚洲精品一二三四区| 午夜精品一区二区三区成人| 免费无遮挡毛片中文字幕| 国产成人一区二区免av| 国产AV福利第一精品| 人妻激情偷乱一区二区三区| 国产精品不卡一区二区久久| 欧美韩中文精品有码视频在线| 亚洲一精品一区二区三区| 一本大道久久香蕉成人网| 精品少妇人妻av无码专区| 和平区| 曰韩无码二三区中文字幕| 美女裸体十八禁免费网站| 亚洲天堂男人的天堂在线|