WCF認證之UserName認證方法
WCF認證的主要作用是幫助我們實現安全的開發環境。在這里我們就為大家介紹一下WCF認證中的一個叫做UserName認證的實現方法。#t#
UserName認證機制很簡單,客戶端提供用戶名密碼信息,到服務器端通過UserName驗證類進行驗證。在此過程中,需要X509證書的支持,使用X509證書并不是用于證書認證而是使用X509證書的密鑰對用戶名密碼進行加密以防在服務器上以明文方式傳遞。
測試時我們可以通過VS命令行創建測試使用的證書,如下:
C:\Program Files\Microsoft Visual Studio 9.0\VC>makecert.exe -sr LocalMachine -s
s My -a sha1 -n CN=SecurityTest -sky exchange –pe
然后我們需要編寫一個驗證用戶名密碼的類,如下:
- Imports System.IdentityModel.Selectors
- Public Class MyCustomValidator
- Inherits UserNamePasswordValidator
- Public Overrides Sub Validate
(ByVal userName As String,
ByVal password As String)- ''驗證過程
- End Sub
- End Class
服務器端的web.config文件還需要增加一些配置,如下:
- <system.serviceModel>
- <bindings>
- <wsHttpBinding>
- <!-- 設置綁定名稱 -->
- <binding name="mySecureBinding">
- <security mode="Message">
- <!-- 設置客戶端身份類型 -->
- <message clientCredentialType="UserName"/>
- </security>
- </binding>
- </wsHttpBinding>
- </bindings>
- <services>
- <service behaviorConfiguration=
"SecurityHost.Service1Behavior"- name="SecurityHost.Service1">
- <endpoint address="" binding=
"wsHttpBinding" bindingConfiguration
="mySecureBinding"- contract="SecurityHost.IService1">
- <identity>
- <!-- 使用以證書一致的DNS名稱 -->
- <dns value="SecurityTest" />
- </identity>
- </endpoint>
- <endpoint address="mex" binding=
"mexHttpBinding" contract=
"IMetadataExchange" />- </service>
- </services>
- <behaviors>
- <serviceBehaviors>
- <behavior name="SecurityHost.Service1Behavior">
- <serviceMetadata httpGetEnabled="true" />
- <serviceDebug includeException
DetailInFaults="false" />- <!-- 配置服務器身份 -->
- <serviceCredentials>
- <!-- 證書類型 -->
- <serviceCertificate findValue=
"SecurityTest" storeLocation="LocalMachine"- storeName="My" x509FindType=
"FindBySubjectName" />- <!-- 自定義驗證類 -->
- <userNameAuthentication
userNamePasswordValidationMode="Custom"- customUserNamePasswordValidatorType=
"ClassLibrary1.MyCustomValidator,ClassLibrary1" />- </serviceCredentials>
- </behavior>
- </serviceBehaviors>
- </behaviors>
- </system.serviceModel>
客戶端進行服務引用之后,可通過如下代碼指定身份信息:
- Dim client As New ServiceReference1.Service1Client
- '' 我們是使用X509證書密鑰加密并非進行證書認證
client.ClientCredentials.Service
Certificate.Authentication.Certificate
ValidationMode = ServiceModel.
Security.X509CertificateValidationMode.None- '' 指定客戶端身份:用戶名、密碼
- client.ClientCredentials.UserName
.UserName = Guid.NewGuid.ToString- client.ClientCredentials.UserName
.Password = Guid.NewGuid.ToString- '' 執行服務方法
Dim str As String = client.GetData(1)
這樣我們就可以進行WCF服務的UserName認證了。