日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
在實(shí)際應(yīng)用中實(shí)現(xiàn)WCF用戶密碼認(rèn)證

WCF框架是一款功能強(qiáng)大的分布式開發(fā)框架。對于初學(xué)者來說,可能其中有些功能不太熟悉。這需要我們在不斷的實(shí)踐中去慢慢研究這些功能。比如WCF用戶密碼認(rèn)證的正確使用。#t#

創(chuàng)新互聯(lián)公司致力于成都網(wǎng)站制作、網(wǎng)站建設(shè),成都網(wǎng)站設(shè)計(jì),集團(tuán)網(wǎng)站建設(shè)等服務(wù)標(biāo)準(zhǔn)化,推過標(biāo)準(zhǔn)化降低中小企業(yè)的建站的成本,并持續(xù)提升建站的定制化服務(wù)水平進(jìn)行質(zhì)量交付,讓企業(yè)網(wǎng)站從市場競爭中脫穎而出。 選擇創(chuàng)新互聯(lián)公司,就選擇了安全、穩(wěn)定、美觀的網(wǎng)站建設(shè)服務(wù)!

以前我們用WebService做分布式系統(tǒng)的時(shí)候,認(rèn)證是個(gè)麻煩的問題,通常的做法是繼承一個(gè)SoapHeader,把用戶名和密碼放到里面,每調(diào)用一個(gè)方法都要把用戶名和密碼傳遞給服務(wù)器端來驗(yàn)證 ,效率相當(dāng)?shù)?,代碼編寫相當(dāng)?shù)穆闊疫€不安全!

WCF支持多種認(rèn)證技術(shù),例如Windowns認(rèn)證、X509證書、Issued Tokens、用戶名密碼認(rèn)證等,在跨Windows域分布的系統(tǒng)中,用戶名密碼認(rèn)證還是比較常用的,要實(shí)現(xiàn)用戶名密碼認(rèn)證,就必須需要X509證書,為什么呢?因?yàn)槲覀冃枰猉509證書這種非對稱密鑰技術(shù)來實(shí)現(xiàn)WCF在Message傳遞過程中的加密和解密,要不然用戶名和密碼就得在網(wǎng)絡(luò)上明文傳遞!詳細(xì)說明就是客戶端把用戶名和密碼用公鑰加密后傳遞給服務(wù)器端,服務(wù)器端再用自己的私鑰來解密,然后傳遞給相應(yīng)的驗(yàn)證程序來實(shí)現(xiàn)身份驗(yàn)證。

當(dāng)然,做個(gè)測試程序就沒有必要去申請一個(gè)X509數(shù)字簽名證書了,微軟提供了一個(gè)makecert.exe的命令專門用來生成測試使用的X509證書的,那我們就來建立一個(gè)測試用的證書,在cmd下輸入以下命令:

makecert.exe -sr LocalMachine -ss My -a sha1 -n CN=MyServerCert -sky exchange –pe

這個(gè)命令的意思就是創(chuàng)建一個(gè)測試的X509證書,這個(gè)證書放在存儲位置為'Localmachine'的'My'這個(gè)文件夾下,證書主題名字叫'MyServerCert',需要更多關(guān)于makecert命令的信息請參考MSDN。

證書建立好了,我們就可以編寫代碼了,在VS2008下建立一個(gè)解決方案并在上面建立兩個(gè)Web項(xiàng)目,一個(gè)是'Asp.net Web 應(yīng)用程序'(客戶端),一個(gè)是'WCF服務(wù)應(yīng)用程序'(服務(wù)器端),我們先來編寫服務(wù)器端代碼,首先我們要編寫自己的WCF用戶密碼認(rèn)證邏輯,先要在WCF項(xiàng)目上添加引用'System.IdentityModel'然后我們建立一個(gè)新的類文件并繼承自'System.IdentityModel.Selectors.UserNamePasswordValidator',然后我們重寫里面的'Validate'方法來實(shí)現(xiàn)用戶名密碼認(rèn)證邏輯。代碼如下;

 
 
 
  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.Linq; 
  4. using System.Text; 
  5. using System.IdentityModel.Selectors; 
  6. using System.IdentityModel.Tokens; 
  7. namespace ServerWcfService.CustomValidators 
  8. public class MyCustomValidator : 
    UserNamePasswordValidator 
  9. /// < summary> 
  10. /// Validates the user name and 
    password combination. 
  11. /// < /summary> 
  12. /// < param name="userName">
    The user name.< /param> 
  13. /// < param name="password">
    The password.< /param> 
  14. public override void Validate
    (string userName, string password) 
  15. // validate arguments 
  16. if (string.IsNullOrEmpty(userName)) 
  17. throw new ArgumentNullException("userName"); 
  18. if (string.IsNullOrEmpty(password)) 
  19. throw new ArgumentNullException("password"); 
  20. // check if the user is not xiaozhuang 
  21. if (userName != "xiaozhuang" || password != "123456") 
  22. throw new SecurityTokenException("用戶名或者密碼錯誤!"); 

上面只是一個(gè)簡單的WCF用戶密碼認(rèn)證,實(shí)際應(yīng)用中用戶名和密碼一般都保存在數(shù)據(jù)庫中,如果驗(yàn)證不通過就拋出一個(gè)'SecurityTokenException'類型的異常;下一步我們需要配置一下服務(wù)端的webConfig文件,我的WebConfig文件Servicemodel配置節(jié)如下:

 
 
 
  1. < system.serviceModel> 
  2. < bindings> 
  3. < wsHttpBinding> 
  4. < binding name="mySecureBinding"> 
  5. < security mode="Message"> 
  6. < message clientCredentialType="UserName"/> 
  7. < /security> 
  8. < /binding> 
  9. < /wsHttpBinding> 
  10. < /bindings> 
  11. < services> 
  12. < service behaviorConfiguration=
    "ServerWcfService.Services.MySimple
    ServiceBehavior" name="ServerWcfService.
    Services.MySimpleService"> 
  13. < endpoint address="" binding=
    "wsHttpBinding" contract="ServerWcfService.
    ServiceContracts.IMySimpleService"
     bindingConfiguration="mySecureBinding"> 
  14. < identity> 
  15. < dns value="MyServerCert"/> 
  16. < /identity> 
  17. < /endpoint> 
  18. < endpoint address="mex" binding=
    "mexHttpBinding" contract="IMetadataExchange"/> 
  19. < /service> 
  20. < /services> 
  21. < behaviors> 
  22. < serviceBehaviors> 
  23. < behavior name="ServerWcfService.
    Services.MySimpleServiceBehavior">
  24. < serviceMetadata httpGetEnabled="true"/> 
  25. < serviceDebug includeExceptionDetailInFaults="false"/> 
  26. < serviceCredentials> 
  27. < serviceCertificate findValue=
    "MyServerCert" x509FindType="FindBySubjectName" 
    storeLocation="LocalMachine" storeName="My"/> 
  28. < userNameAuthentication userNamePassword
    ValidationMode="Custom" customUserName
    PasswordValidatorType="ServerWcfService.
    CustomValidators.MyCustomValidator,ServerWcfService"/> 
  29. < /serviceCredentials> 
  30. < /behavior> 
  31. < /serviceBehaviors> 
  32. < /behaviors> 
  33. < /system.serviceModel> 

加粗的那些是我加上去的或者在默認(rèn)上修改了的。Bindings節(jié)指定了客戶端提供的認(rèn)證類型為'username'并在endpoint節(jié)中指定bianding配置。在dns節(jié)中修改原來的localmachine為MyServerCert,當(dāng)然你也可以修改為別的,這取決于你的證書主題名稱是什么。也就是上面命令中的CN=MyServerCert,接下來我們加入在serviceCredentials配置節(jié),并在里面配置兩個(gè)小節(jié),ServiceCertificate節(jié)中指定了我們的X509證書的位置,以用來加解密message,usernameAuthentication節(jié)中指定了我們自己的WCF用戶密碼認(rèn)證邏輯。

Sorry,忘了一件事情,就是寫一個(gè)測試的服務(wù)契約并實(shí)現(xiàn),寫法上和無認(rèn)證的寫法一樣,如下

 
 
 
  1. ServerWcfService.Service
    Contracts.IMySimpleService: 
  2. [OperationContract] 
  3. string PrintMessage
    (string message); 

這樣,服務(wù)端的代碼編寫和配置就完成了,生成項(xiàng)目測試一下,頁面顯示服務(wù)已生成成功。

接下來我們開始編寫客戶端代碼,先在客戶端引用剛才生成的WCF服務(wù),然后編寫客戶端代碼如下:

 
 
 
  1. protected void btnPrint_Click(object 
    sender, EventArgs e) 
  2. TestWCFService.MySimpleServiceClient 
    client = new ClientWeb.TestWCFService.
    MySimpleServiceClient(); 
  3. client.ClientCredentials.UserName.
    UserName = "xiaozhuang"; 
  4. client.ClientCredentials.UserName.
    Password = "123456"; 
  5. lbMessage.Text = client.PrintMessage
    (txtMessage.Text); 

如果你有一個(gè)真正的X509證書,那么現(xiàn)在的WCF用戶密碼認(rèn)證代碼就可以正常運(yùn)行了。但是很不幸,我們的證書是測試用的,我們運(yùn)行的時(shí)候出錯:'X.509 certificate CN=MyServerCert 鏈生成失敗。所使用的證書具有無法驗(yàn)證的信任鏈。請?zhí)鎿Q該證書或更改 certificateValidationMode。已處理證書鏈,但是在不受信任提供程序信任的根證書中終止',WCF無法驗(yàn)證測試證書的信任鏈,那我們要做的就是繞過這個(gè)信任驗(yàn)證,具體做法如下:

先要在Asp.net Web應(yīng)用程序項(xiàng)目上添加引用'System.IdentityModel'然后我們建立一個(gè)新的類文件并繼承自'System.IdentityModel.Selectors.X509CertificateValidator',然后我們重寫里面的'Validate'方法來實(shí)現(xiàn)我們自己的X509認(rèn)證邏輯,代碼如下:

 
 
 
  1. using System; 
  2. using System.Configuration; 
  3. using System.IdentityModel.Selectors; 
  4. using System.IdentityModel.Tokens; 
  5. using System.Security.Cryptography.
    X509Certificates; 
  6. namespace ClientWeb.CustomX509Validator 
  7. /// < summary> 
  8. /// Implements the validator for X509
     certificates. 
  9. /// < /summary> 
  10. public class MyX509Validator: 
    X509CertificateValidator 
  11. /// < summary> 
  12. /// Validates a certificate. 
  13. /// < /summary> 
  14. /// < param name="certificate">
    The certificate the validate.< /param> 
  15. public override void Validate
    (X509Certificate2 certificate) 
  16. // validate argument 
  17. if (certificate == null) 
  18. throw new ArgumentNullException
    ("X509認(rèn)證證書為空!"); 
  19. // check if the name of the certifcate matches 
  20. if (certificate.SubjectName.Name != 
    ConfigurationManager.AppSettings["CertName"]) 
  21. throw new SecurityTokenValidationException(
    "Certificated was not issued by thrusted issuer"); 

你可以把Validate方法里面留空讓所有的認(rèn)證都通過,也可以自己定義認(rèn)證邏輯,如果認(rèn)證失敗,就拋出'SecurityTokenValidationException'的異常,然后我們配置一下客戶端的webconfig讓它使用我們自己的X509認(rèn)證,增加以下的配置節(jié),并在'endpoint'節(jié)中指定behaviorConfiguration="myClientBehavior"。

 
 
 
  1. < behaviors> 
  2. < endpointBehaviors> 
  3. < behavior name="myClientBehavior"> 
  4. < clientCredentials> 
  5. < serviceCertificate> 
  6. < authentication certificateValidationMode=
    "Custom" customCertificateValidatorType=
    "ClientWeb.CustomX509Validator.
    MyX509Validator,ClientWeb" /> 
  7. < /serviceCertificate> 
  8. < /clientCredentials> 
  9. < /behavior> 
  10. < /endpointBehaviors> 
  11. < /behaviors> 

OK,客戶端代碼和配置完成,現(xiàn)在你可以運(yùn)行自己的WCF用戶密碼認(rèn)證程序了。


網(wǎng)站欄目:在實(shí)際應(yīng)用中實(shí)現(xiàn)WCF用戶密碼認(rèn)證
當(dāng)前網(wǎng)址:http://m.5511xx.com/article/dphceee.html