WCF簡單教程(8)安全-Windows認證
第八篇:WCF安全
WCF提供了非常豐富的加密機制與稽核機制,以保證對外提供的服務安全可靠。本文是簡單教程,所以只挑其中的一小部分來聊聊。
先來看看最簡單的Windows認證。
所謂Windows認證,是指客戶端訪問時,要提供服務端認可的Windows使用者身份。
1、服務端
安全配置主要體現在App.config中:
- <?xml version=“1.0” encoding=“utf-8” ?>
- <configuration>
- <system.serviceModel>
- <services>
- <service name=“Server.DataProvider”>
- <!– 本例中使用netTcpBinding,注意指定了一個名為tcpBinding的設定,見下文 –>
- <endpoint address=“” binding=“netTcpBinding” contract=“Server.IData” bindingConfiguration=“tcpBinding” />
- <host>
- <baseAddresses>
- <add baseAddress=“net.tcp://localhost:8081/wcf” />
- </baseAddresses>
- </host>
- </service>
- </services>
- <!–客戶端的身份認證是設定在bindings節中的–>
- <bindings>
- <!–注意此節要與前面的binding匹配,表示為netTcpBinding方式的繫結進行配置–>
- <netTcpBinding>
- <!–定義一個名為tcpBinding的設定,就是前面endpoint中用到的–>
- <binding name=“tcpBinding”>
- <!–使用Message方式的加密,至於它與Transport方式的區別,可先忽略,後面再講–>
- <security mode=“Message”>
- <!–指定客戶端認證使用Windows方式–>
- <message clientCredentialType=“Windows” />
- </security>
- </binding>
- </netTcpBinding>
- </bindings>
- </system.serviceModel>
- </configuration>
契約實現類我們修改一下,方便看到呼叫者的身份:
- using System;
- using System.ServiceModel;
- namespace Server
- {
- [ServiceBehavior]
- public class DataProvider : IData
- {
- public string SayHello()
- {
- //WindowsIdentity即代表訪問者的身份標識
- return string.Format(“Hello {0}”, OperationContext.Current.ServiceSecurityContext.WindowsIdentity.Name);
- }
- }
- }
2、客戶端
客戶端要對應調整App.config:
- <?xml version=“1.0” encoding=“utf-8” ?>
- <configuration>
- <system.serviceModel>
- <client>
- <!–定義endpoint時指定使用特定的配置,另外這個IP是一會兒執行服務端的機器的IP–>
- <endpoint binding=“netTcpBinding” contract=“Server.IData” address=“net.tcp://192.168.90.90:8081/wcf” name=“DataProvider” bindingConfiguration=“tcp” />
- </client>
- <!–客戶端與服務端的bindings節設定一致–>
- <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
- {
- class Program
- {
- static void Main(string[] args)
- {
- //建立一個ChannelFactory,指定使用名為DataProvider的配置
- var factory = new ChannelFactory<Server.IData>(“DataProvider”);
- //指定使用者名稱、密碼,這個Test是服務端Windows上的一個普通帳戶,如果加入了域,還要指定ClientCredential.Domain
- factory.Credentials.Windows.ClientCredential.UserName= “Test”;
- factory.Credentials.Windows.ClientCredential.Password = “test”;
- //建立Channel,並呼叫SayHello方法
- var proxy = factory.CreateChannel();
- Console.WriteLine(proxy.SayHello());
- ((IChannel)proxy).Close();
- }
- }
- }
其中的指定的使用者名稱與密碼是服務端存在的一個Windows使用者。
OK,在兩臺機器上分別執行服務端和客戶端,能夠正常完成呼叫,輸出“Hello Test-PCTest”,這個Test-PCTest就是我們呼叫時傳遞的使用者身份,注意是“機器名使用者名稱”的形式,如果是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)
是一個身份驗證失敗的異常。
用Windows帳戶來做驗證,其實是個挺麻煩的事情,只有較少的系統是這麼做的,我們還是希望能用更通用的使用者名稱密碼來進行身份驗證,下一篇我們就來看看如何做。
本文轉自 BoyTNT 51CTO部落格,原文連結:http://blog.51cto.com/boytnt/815117,如需轉載請自行聯絡原作者
相關文章
- [WCF安全系列]談談WCF的客戶端認證[使用者名稱/密碼認證]客戶端密碼
- WCF傳輸安全(TransferSecurity)的基本概念和原理:認證(Authentication)[上篇]
- Solon Auth 認證框架使用演示(更簡單的認證框架)框架
- 表單驗證教程簡介
- Windows安全認證是如何進行的?[Kerberos篇]WindowsROS
- 去除windows身份認證帶來的安全隱患Windows
- 禁用windows本地認證Windows
- WCF分散式安全開發實踐(9):訊息安全模式之Windows身份驗證:Message_Windows_NetTcpBinding分散式模式WindowsTCP
- 利用WCF建立簡單的RESTFul ServiceREST
- .NET自定義認證雖然簡單,但好用
- MySQL密碼加密認證的簡單指令碼MySql密碼加密指令碼
- 玩轉spring boot——簡單登入認證Spring Boot
- WCF HttpBinding 安全解析 (5)Basic驗證(IIS宿主)HTTP
- Spring認證-Spring 安全架構專題教程Spring架構
- 統一身份認證系統的簡單看法
- Laravel 使用者認證最簡單的實現 比 Jetstream 要簡單很多Laravel
- 超簡單 Python 安全批量打水印教程!Python
- 一文讀懂Https的安全性原理、數字證書、單項認證、雙項認證等HTTP
- 簡單抓包分析:LDAP的simple方式認證過程LDA
- WCF系列教程地址
- SQL Server正確刪除Windows認證使用者的方法教程SQLServerWindows
- Spark 框架安全認證實現Spark框架
- SpringBoot安全認證SecuritySpring Boot
- Isito 入門(九):安全認證
- 在NET8中使用簡化的 AddJwtBearer 認證JWT
- oracle os認證和口令檔案認證的簡要解析Oracle
- Centos8伺服器安全高階篇(四 使用者認證)CentOS伺服器
- WCF學習筆記(一):WCF簡介筆記
- 無密碼身份驗證:安全、簡單且部署快速密碼
- 最簡單易懂的 Spring Security 身份認證流程講解Spring
- jwt 多使用者認證,一次簡單處理。JWT
- 聊一聊HTTPS雙向認證的簡單應用HTTP
- 中德啟動網路安全認證認可合作
- Java 8簡明教程Java
- Java 8 簡明教程Java
- WCF安全指南釋出
- Yii2.0 RESTful API 認證教程RESTAPI
- CKAD認證中的部署教程