WCF消息拦截,利用消息拦截做身份验证服务
生活随笔
收集整理的這篇文章主要介紹了
WCF消息拦截,利用消息拦截做身份验证服务
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本文參考 ?http://blog.csdn.net/tcjiaan/article/details/8274493 ?博客而寫
添加對信息處理的類
/// <summary>/// 消息攔截/// </summary>public class MyMessageInspector:IClientMessageInspector,IDispatchMessageInspector{//用戶名密碼static private string uName = "admin";static private string pWord = "admin";//初始化public MyMessageInspector() { }public MyMessageInspector(string name, string pass){uName = name;pWord = pass;}//客戶端接收的信息之后的處理void IClientMessageInspector.AfterReceiveReply(ref Message replaly, object correlationState){Console.WriteLine("客戶端接收的信息:\n{0}",replaly.ToString());}//客戶端發送消息之前的處理object IClientMessageInspector.BeforeSendRequest(ref Message request, IClientChannel channel){//Console.WriteLine("客戶端發送請求前的SOAP消息:\n{0}", request.ToString());MessageHeader hdUserName = MessageHeader.CreateHeader("u", "fuck", uName);MessageHeader hdPassWord = MessageHeader.CreateHeader("p", "fuck", pWord);request.Headers.Add(hdUserName);request.Headers.Add(hdPassWord);return null; }//服務 端接收到消息之后的處理object IDispatchMessageInspector.AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext){//Console.WriteLine("服務器端:接收到的請求:\n{0}", request.ToString());string un = request.Headers.GetHeader<string>("u", "fuck");string ps = request.Headers.GetHeader<string>("p", "fuck");if (un == "admin" && ps == "abcd"){Console.WriteLine("用戶名和密碼正確。");}else{throw new Exception("驗證失敗,滾吧!");}return null; }//服務端在發送消息之前的處理void IDispatchMessageInspector.BeforeSendReply(ref Message reply, object correlationState){Console.WriteLine("服務器即將作出以下回復:\n{0}", reply.ToString());}}以上的用戶名和密碼都是固定值 ,你可以查詢數據庫,判斷 ?是否有此用戶,來保證 身份安全性
添加插入結結點的方法類
/// <summary>/// 插入到終結點的Behavior /// </summary>public class MyEndPointBehavior : IEndpointBehavior{//用戶名密碼private string UserName = "admin";private string PassWord = "admin";public MyEndPointBehavior() { }public MyEndPointBehavior(string name,string pass) {UserName = name;PassWord = pass;}public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters){return;}public void ApplyClientBehavior(ServiceEndpoint endopint ,ClientRuntime clientRuntime){// 植入“偷聽器”客戶端clientRuntime.MessageInspectors.Add(new MyMessageInspector(UserName,PassWord));}public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher){// 植入“偷聽器” 服務器端 endpointDispatcher.DispatchRuntime.MessageInspectors.Add(new MyMessageInspector(UserName,PassWord));}public void Validate(ServiceEndpoint endpoint){return;}}上面類的用戶名和密碼是由客戶端傳過來的,如果客戶端沒有傳過來則默認都為 "admin"
注,以上兩個類在服務 端和客戶端都需要被引用?
宿主程序 ,采用控制臺應用程序?
static void Main(string[] args){Uri baseAddress = new Uri("http://localhost:1378/services");using (ServiceHost host = new ServiceHost(typeof(WCF_LanJie_Lib.Service), baseAddress)) {WSHttpBinding bind = new WSHttpBinding();host.AddServiceEndpoint(typeof(WCF_LanJie_Lib.IService),bind,"/Test");// 添加服務描述 host.Description.Behaviors.Add(new ServiceMetadataBehavior { HttpGetEnabled = true });// 把自定義的IEndPointBehavior插入到終結點中 foreach (var endpont in host.Description.Endpoints){endpont.Behaviors.Add(new WCF_LanJie_Lib.MyEndPointBehavior());}try{// 打開服務 host.Open();Console.WriteLine("服務已啟動。");}catch (Exception ex){Console.WriteLine(ex.Message);}Console.ReadKey(); }}其中,添加服務描述?HttpGetEnabled = true?是用于打開元數據 ,可供訪問和下載
foreach ()循環是用來把服務 終結點和消息攔截的類相聯系起來
客戶端
客戶端也是一個控件臺應用程序
static void Main(string[] args){Client.ServiceClient cli = new Client.ServiceClient();//引用//定義一個消息攔截類,初始化WCF_LanJie_Lib.MyEndPointBehavior mypoint = new MyEndPointBehavior("admin", "abcd");// 把自定義的IEndPointBehavior插入到終結點中 cli.Endpoint.Behaviors.Add(mypoint);//服務端調用方法Console.WriteLine(cli.GetDate("qwe"));Console.ReadLine();}其中 ?字符串 "admin"即為用戶名和密碼,你可以根據程序 的用戶名和密碼對基進行修改!!!
到此,一個簡單的消息攔截,身份驗證就完成 了!
轉載于:https://www.cnblogs.com/chcong/p/4323134.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的WCF消息拦截,利用消息拦截做身份验证服务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET设计模式(18):迭代器模式(I
- 下一篇: 即时通信2