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"即为用户名和密码,你可以根据程序 的用户名和密码对基进行修改!!!
到此,一个简单的消息拦截,身份验证就完成 了!
WCF消息拦截,利用消息拦截做身份验证服务的更多相关文章
- 解决WCF 调用方未由服务器进行身份验证或消息包含无效或过期的安全上下文令牌
错误描述: 1. WCF:调用方未由服务器进行身份验证 2. 无法处理消息.这很可能是因为操作“http://tempuri.org/ISCCLSvc/GetCarriersByWareHouse”不 ...
- WCF:调用方未由服务器进行身份验证
错误描述: 1. WCF:调用方未由服务器进行身份验证 2. 无法处理消息.这很可能是因为操作“http://tempuri.org/ISCCLSvc/GetCarriersByWareHouse”不 ...
- 利用工具破解HTTP身份验证的多种方法
https://www.hackingarticles.in/multiple-ways-to-exploiting-http-authentication/ 1)场景 利用Apache配置HTTP验 ...
- 利用FormsAuthentication.RedirectFromLoginPage进行身份验证
web.config中: <authentication>节 格式: <authentication mode="Forms"> //I.Window ...
- memcached 是如何做身份验证的?
没有身份认证机制!memcached 是运行在应用下层的软件(身份验证应该是应用 上层的职责).memcached 的客户端和服务器端之所以是轻量级的,部分原因就 是完全没有实现身份验证机制.这样,m ...
- ASP.NET Core身份验证服务框架IdentityServer4-整体介绍
一.整体情况 现代应用程序看起来更像这个: 最常见的相互作用: 浏览器与Web应用程序的通信 Browser -> Web App Web应用程序与Web API通信 基于浏览器的应用程序与We ...
- Openldap- 大机群身份验证服务
无论在哪个行业,数据安全永远都是摆在首要地位.尤其是在大数据行业上,谁掌握了数据,谁就有可能成为下个亿万富豪的环境中,数据安全更为重要.大数据的安全可以从哪些地方入手,首先可以在身份验证上面入手.在大 ...
- MVC中使用AuthorizeAttribute做身份验证操作
代码顺序为:OnAuthorization-->AuthorizeCore-->HandleUnauthorizedRequest 如果AuthorizeCore返回false时,才会走H ...
- MVC中使用AuthorizeAttribute做身份验证操作【转】
http://blog.csdn.net/try530/article/details/7782704 代码顺序为:OnAuthorization-->AuthorizeCore-->Ha ...
随机推荐
- .Net Framework 3.5, 3.5 sp1 中文版离线安装
安装.Net Framework 3.5和3.5 sp1时会自动下载语言包. 解决办法:下载语言包,将语言包拷贝到安装里. 1.用压缩工具解压.NetFramework3.5 2.将语言包文件拷贝到c ...
- java的事务处理
本文转自http://zhenchengchagangzi.iteye.com/blog/1159493 java的事务处理,如果对数据库进行多次操作,每一次的执行或步骤都是一个事务.如果数据库操作在 ...
- Ubuntu里面软件的安装与卸载
在Ubuntu里面,有时候碰到软件配置错了,这是重新再安装的话,会检测到已安装,系统不会再重新安装,就需要卸载之后重装 1.通过deb包安装的情况: 安装.deb包: 代码:sudo dpkg -i ...
- [Linux]安装phpredis扩展
1.下载phpredis,解压并进入目录,在目录下运行phpize /usr/local/php/bin/phpize ./configure --enable-redis-igbinary --wi ...
- java 入门 第二季1
(1). 类和对象(java 语言是面向对象的) 1). 类是对象的类型 具有相同的属性和方法的一组对象的集合 类:属性和方法 定义类: 类名 属性 方法 //class为关键字 2.定义类时,首字母 ...
- 【编程题目】一个整数数组,长度为 n,将其分为 m 份,使各份的和相等,求 m 的最大值★★ (自己没有做出来!!)
45.雅虎(运算.矩阵): 2.一个整数数组,长度为 n,将其分为 m 份,使各份的和相等,求 m 的最大值 比如{3,2,4,3,6} 可以分成 {3,2,4,3,6} m=1; {3,6}{2,4 ...
- CCF I'm Stuck!
问题描述 试题编号: 201312-5 试题名称: I'm stuck! 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给定一个R行C列的地图,地图的每一个方格可能是'#', ...
- LightOJ 1197 Help Hanzo(区间素数筛选)
E - Help Hanzo Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%lld & %llu Submit ...
- php面向对象中的静态与抽象,接口
静态又包括: 普通成员: 普通成员是属于对象的 静态成员: 静态成员是属于类的 关键字:static self关键字:在类里面代表该类,前面不用加$ 在静态方法里面不能调用普通成员 在普通方法里面能够 ...
- 虚拟机中的centos在nat模式下连不上外网
这两天需要配置ftp服务器,可是虚拟机在nat模式下死活连不上外网,主机能够通过该ssh与虚拟机进行连接,虚拟机也能ping同一网段主机的IP地址,但就是ping不通外网, 开始我是这样配置的: 主机 ...