WCF簡單教程 8 安全 Windows認證

2021-09-21 22:39:27 字數 3441 閱讀 8408

第八篇:wcf安全

wcf提供了非常豐富的加密機制與審核機制,以保證對外提供的服務安全可靠。本文是簡單教程,所以只挑其中的一小部分來聊聊。

先來看看最簡單的windows認證。

所謂windows認證,是指客戶端訪問時,要提供服務端認可的windows使用者身份。

1、服務端

<?

xmlversion

="1.0"

encoding

="utf-8"

?>

<

configuration

>

<

system.servicemodel

>

<

services

>

<

service

name

="server.dataprovider"

>

<

endpoint

address=""

binding

="nettcpbinding"

contract

="server.idata"

bindingconfiguration

="tcpbinding"

/>

<

host

>

<

baseaddresses

>

<

addbaseaddress

="net.tcp://localhost:8081/wcf"

/>

baseaddresses

>

host

>

service

>

services

>

<

bindings

>

<

nettcpbinding

>

<

binding

name

="tcpbinding"

>

<

security

mode

="message"

>

<

message

clientcredentialtype

="windows"

/>

security

>

binding

>

nettcpbinding

>

bindings

>

system.servicemodel

>

configuration

>

契約實現類我們修改一下,方便看到呼叫者的身份:

using

system; 

using

system.servicemodel; 

namespace

server 

", operationcontext.current.servicesecuritycontext.windowsidentity.name); 

} } 

}2、客戶端

<?

xmlversion

="1.0"

encoding

="utf-8"

?>

<

configuration

>

<

system.servicemodel

>

<

client

>

<

endpoint

binding

="nettcpbinding"

contract

="server.idata"

address

="net.tcp:"

name

="dataprovider"

bindingconfiguration

="tcp"

/>

client

>

<

bindings

>

<

nettcpbinding

>

<

binding

name

="tcp"

>

<

security

mode

="message"

>

<

message

clientcredentialtype

="windows"

/>

security

>

binding

>

nettcpbinding

>

bindings

>

system.servicemodel

>

configuration

>

然後是**,要指定訪問時客戶端使用的使用者名稱密碼:

using

system; 

using

system.servicemodel; 

using

system.servicemodel.channels; 

namespace

client  } 

} 其中的指定的使用者名稱與密碼是服務端存在的乙個windows使用者。

ok,在兩台機器上分別執行服務端和客戶端,能夠正常完成呼叫,輸出「hello test-pc\test」,這個test-pc\test就是我們呼叫時傳遞的使用者身份,注意是「機器名\使用者名稱」的形式,如果是ad環境,那麼就是「域\使用者名稱」的形式。

如果給定乙個錯誤的使用者名稱密碼,則呼叫時會收到exception:

未處理的異常:  system.servicemodel.security.securitynegotiationexception: 呼叫方未由服務進行身份驗證。 

---> system.servicemodel.faultexception: 無法滿足對安全令牌的請求,因為身份驗證失敗。

在 system.servicemodel.security.securityutils.throwifnegotiationfault(message message, endpointaddress target) 

在 system.servicemodel.security.sspinegotiationtokenprovider.getnextoutgoingmessagebody(message incomingmessage, sspinegotiationtokenproviderstate sspistate) 

是乙個身份驗證失敗的異常。

WCF簡單教程 1 入門

wcf是dotnet體系中很重要的一項技術,但是組內很多組員通過書籍自學的時候感覺涉及面太廣 配置檔案太複雜,新名詞太多 抓不到頭緒,有感於此,決定進行一次組內技術培訓,順便把培訓講義整理到blog上來。不求大而全,而是要讓初學者快速入門,因此想入例項入手,並刻意隱藏一些初期用不到的內容,以降低入門...

WCF簡單教程 1 入門

wcf是dotnet體系中很重要的一項技術,但是組內很多組員通過書籍自學的時候感覺涉及面太廣 配置檔案太複雜,新名詞太多 抓不到頭緒,有感於此,決定進行一次組內技術培訓,順便把培訓講義整理到blog上來。不求大而全,而是要讓初學者快速入門,因此想入例項入手,並刻意隱藏一些初期用不到的內容,以降低入門...

WCF簡單教程 4 資料契約

第四篇 用資料契約傳遞自定義資料物件 之前的演示中,我們一直都是在用string型別做引數和返回值,實際專案中肯定會傳遞自定義的資料型別。與webservice不同,wcf想傳遞自定義資料,必須要將其定義為資料契約。看乙個例子 using system using system.runtime.se...