windows communication foundation (wcf) 是 microsoft 為構建面向服務的應用程式而提供的統一程式設計模型(摘自msdn),在分布式環境下的安全問題尤為重要,如果你覺得使用了wcf預設的安全措施可以讓你高枕 無憂,那明天你可就以回家種田了,當然,對於學習來說,足夠了~,但我們講的是真正的專案應用,wcf在各種協議下的安全提供和保證是不盡相同的。
背景
system.identitymodel.selectors
.usernamepasswordvalidator
抽象類,並重寫其
validate方法來實現自己的使用者名稱密碼驗證程式,實際上,內建的使用者名稱密碼驗證方式比自定義的使用者名稱密碼驗證方式要可靠得多,因為自定義的使用者名稱密碼驗證程式任何人都可以構造,但是標準的使用者名稱密碼驗證方式剛是將使用者提供的使用者名稱密碼對映到windows賬戶,所以,如果對映失敗,意味著驗證不通過,以下示例在伺服器端啟用自定義的使用者名稱密碼驗證程式,客戶端在呼叫服務前需要提供訪問服務所需要的使用者名稱密碼,並在endpointidenty中向伺服器標識自己是合法使用者,具體標識參見本系列第二章:wcf安全之endpointidentity。如果伺服器驗證通過,將向客戶端返回乙個從資料庫查詢到的xml列(xelement物件),並將內容列印到控制台。
開始吧
1、實現自定義使用者名稱密碼方式有哪些要求?
如上面的所講,首先,我們需要建立乙個類,來繼承自system.identitymodel.selectors
.usernamepasswordvalidator抽象類,並重其validate方法,**比較簡單,當然,這只是用於演示作用,如果是在實際的專案中,你完全可以將使用者名稱密碼儲存在持久化介質上,請看實現:
public
class
customuserpassword : usernamepasswordvalidator}}
2、配置安全策略和模式
你可以在**或者在配置檔案中完成此安全策略實現過程,但是如果你是以**方式實現,做之前請參考artech的文章:中對channelfactory的快取機制" href="" target="_blank">[原創]wcf技術剖析之八:clientbase中對channelfactory的快取機制
(請原諒我引用),配置檔案實現如下:
//繫結配置
<
binding name="
endpointbinding
">
<
security mode="
message
">
<
transport clientcredentialtype="
windows
"protectionlevel="
encryptandsign
"/>
<
message clientcredentialtype="
username
"/>
security
>
binding
>
//服務配置
<
servicecredentials
>
<
servicecertificate findvalue="
192168168151service
"x509findtype="
findbysubjectname
"storelocation="
localmachine
"storename="
my"/>
<
usernameauthentication customusernamepasswordvalidatortype="
userdataservcie.customuserpassword,userdataservcie
"usernamepasswordvalidationmode="
custom
"/>
servicecredentials
>
在上面的過程中,我們的繫結配置中的安全策略必須是訊息級別的安全,因為在傳輸級別中,是不提供使用者名稱密碼驗證方式的。兩種級別的的選擇比較主要體現在安全和效率上,如果你的傳輸效率上沒有什麼問題,建議你選擇第四種安全策略:transportwithmessagecredential,transportwithmessagecredential的好處是既提供安全傳輸,又保證訊息加密,多好!相對來說還是比較簡單的吧
3、證書的配置
4、客戶端呼叫服務
客戶端在呼叫服務前設定乙個使用者名稱密碼(此使用者名稱密碼你可動態配置,具體怎麼動態你隨意,可以是從持久介質上提取,也可以是使用者輸入),如下:
userdataclient client
=new
userdataclient();
client.clientcredentials.username.username ="
admin";
client.clientcredentials.username.password ="
admin";
userextension useree
=client.getuserextension();
xelement xe
=client.getuserextensionxelement(
null
);console.writeline(
"呼叫成功,開始列印訊息."
);console.foregroundcolor
=consolecolor.red;
console.writeline(
"******************************====");
console.writeline(xe.value);
5、呼叫成功,控制台輸出呼叫資訊
後話:總體來說,自定義的使用者名稱密碼驗證程式還是比較簡單的,只是在效率上會有點問題。
說得不對的地方,歡迎拍磚!
wcf自定義使用者名稱密碼驗證
一 建立證書 makecert.exe sr localmachine ss my a sha1 n cn testserver sky exchange pe 二 建立wcf服務 配置檔案 三 增加乙個自定義驗證類 validator類,它要繼承system.identitymodel.selec...
wcf 證書 ssl 自定義使用者名稱密碼
1.生成證書 makecert sr localmachine ss my n cn wcfserver sky exchange pe r 2.ssl證書設定 hash 證書的指紋 guid 呼叫的應用程式的guid 個人覺得win8下用netsh比較好 記得管理員許可權 3.服務端配置 1.繫結...
remoting 安全認證,密碼,使用者名稱
的回覆 伺服器端 namespace remoteserver public string getthescoop string name 配製檔案 type remoteserver.scoop,remoteserver objecturi scoop.soap 客戶端 static void m...