博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WCF安全:通过 扩展实现用户名密码认证
阅读量:6700 次
发布时间:2019-06-25

本文共 3711 字,大约阅读时间需要 12 分钟。

  在webSservice时代,可以通过SOAPHEADER的方式很容易将用户名、密码附加到SOAP header消息头上,用户客户端对调用客户端身份的验证。在WCF 时代,也可以通过OperationContext.Current.IncomingMessageHeaders的方式将用户名、密码附加到SOAP消息中。但是这种方式实现起来有个缺点;那就是所有调用客户端都需要这样做才能将我们需要通过认证的帐号、密码附加到SOAP消息上。实际上,也可以通过WCF扩展的方式,在客户端自动将用户名、密码附加到SOAP消息中。这即是本文主题。

1、客户端消息自动附加用户名、密码

  实现IClientMessageInspector接口,用于附加调用者的账号、密码信息

public class ClientMessageInspector : IClientMessageInspector    {        public void AfterReceiveReply(ref Message reply, object correlationState)        {                    }        public object BeforeSendRequest(ref Message request, IClientChannel channel)        {            MessageHeader userNameHeader = MessageHeader.CreateHeader("OperationUserName", "http://tempuri.org", "account", false, "");            MessageHeader pwdNameHeader = MessageHeader.CreateHeader("OperationPwd", "http://tempuri.org", "password", false, "");            request.Headers.Add(userNameHeader);            request.Headers.Add(pwdNameHeader);            Console.WriteLine(request);            return null;        }    }

2、实现IEndpointBehavior 接口。用户将客户端的消息检查器添加到clientruntime的消息检查器集合中.注意,以下代码中为了简单将服务端分发消息检查器也添加到服务端终结点分发器(EndpointDispatcher)的分发运行时的消息检查器中。

public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)        {                    }        public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)        {            clientRuntime.MessageInspectors.Add(new ClientMessageInspector());//客户端使用        }        public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)        {            endpointDispatcher.DispatchRuntime.MessageInspectors.Add(new MessageDispatcher());//服务端使用        }        public void Validate(ServiceEndpoint endpoint)        {                    }

3、实现抽象类BehaviorextensionElement.用于在配置文件中配置对WCF服务行为的扩展

internal class MessageBindingElement : BehaviorExtensionElement    {        public override Type BehaviorType        {            get { return typeof (MessageEndpointBehavior); }        }        protected override object CreateBehavior()        {            return new MessageEndpointBehavior();        }    }

4、服务端验证客户端的账号、密码

实现IDispatcherMessageInspector

public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)        {            Console.WriteLine(request);            string userName = GetHeaderValue("OperationUserName");            string pwd = GetHeaderValue("OperationPwd");            if ("account" == userName && "password" == pwd)            {                return null;            }            throw new Exception("用户名、密码错误");        }        public void BeforeSendReply(ref Message reply, object correlationState)        {                    }        string GetHeaderValue(string key)        {            int index = OperationContext.Current.IncomingMessageHeaders.FindHeader(key, "http://tempuri.org");            if (index >= 0)            {                return OperationContext.Current.IncomingMessageHeaders.GetHeader
(index).ToString(); } return null; }

5、服务端配置;

6、客户端配置;

7、运行结果图;

服务端;

客户端;

转载地址:http://hbwlo.baihongyu.com/

你可能感兴趣的文章
1.平凡之路-ORM概述
查看>>
Electron(1.6.11) + koa2 仿腾讯TGP游戏登录器(一):环境部署
查看>>
es8的字符串填充、关于对象、关于函数
查看>>
开源情报订阅OpenTaxii+mysql+nginx 配置教程
查看>>
关于$.Callbacks()传参问题
查看>>
专注服务,而非容器
查看>>
关于css命名的一点思考,探讨一下css命名空间的可行性
查看>>
CSS进阶篇--你用过css3的这个currentColor新属性吗?使用与兼容性
查看>>
[MachineLearing]6步进入机器学习领域(译)
查看>>
二列布局
查看>>
AdminLTE For Laravel 后台模板
查看>>
magento2开发,你可能需要补充的知识点
查看>>
字母和数字键的键码值(keyCode)
查看>>
Gradle之恋-Init插件
查看>>
获得包含中英文字符串的自然长度
查看>>
面试时,面试官到底在考察什么?
查看>>
微服务架构的设计模式
查看>>
.NET Core如何为项目提供高性能解决方案?
查看>>
跨平台移动应用开发迎来“大杀器”,Xamarin.Essentials正式版发布
查看>>
JavaOne 2016——首日亮点
查看>>