WebService使得不同开发工具开发出来的程序可以在网络连通的环境下相互通信,它最大的特点就是标准化(基于XML的一系列标准)带来的跨平台、跨开发工具的通用性,基于HTTP带来的畅通无阻的能力(跨越防火墙)。
WebService给我们的软件开发带来了诸多好处,但是有一点还是必须要考虑到的,那就是安全问题。提供Service的一方要控制用户的限制访问,就要对来访的用户进行身份验证。验证成功则继续提供服务,否则就触发无权访问的异常,返回给客户。那么现在我们要解决的问题是这样的:用户的身份认证信息如何在调用主要服务前发送到服务方,从而进行验证?
在WebService中,用户身份认证信息可以在客户端通过soap头(soap header)进行传送。在WebService服务端的编写中,需要对soap头进行处理,这个处理过程就是提取Soap Header中的用户认证信息进行验证。下面就来看看在Delphi中这个身份认证是如何实现的。

一、   自定义的Header类
你需要定义一个用来存放认证信息的类,这个类继承于TSoapHeader。
TAuthHeader = class(TSOAPHeader)
private
   FUserName: WideString;
  FPassWord: WideString;
published
  property UserName: WideString read FUserName write FUserName;
  property PassWord: WideString read FPassWord write FPassWord;
end;
这个类包含了用户名和密码两个属性,当然你可以根据情况增加更多的信息。
再说一下这个类是在哪定义的,它是定义在服务端的接口声明单元。服务发布以后,生成的WSDL中会有这个类的定义,这样在客户端用WSDL Importer导入接口单元的时候,这个类也会自动生成,当然你还要在服务端对这个类进行注册:
InvRegistry.RegisterHeaderClass(TypeInfo(ISoapAuth), TAuthHeader);
RemClassRegistry.RegisterXSClass(TAuthHeader);
ISoapAuth是服务端提供的服务接口。

二、   客户端发送Header
我们还假设ISoapAuth是服务端提供的服务接口,它提供了GetInfo()这么一个服务。
客户端程序片段:
procedure TClientForm.GetInfoButtonClick(Sender: TObject);
var
   aIntf: ISoapAuth;
Headers: ISOAPHeaders;
  H: TAuthHeader;
Begin
   aIntf := (HTTPRio as ISoapAuth);
  H := TAuthHeader.Create;
  H.UserName := 'piao' ;  //这里只是举个例子
H.PassWord := '840717';
Try
   Headers := (aIntf  as   ISOAPHeaders);
  Headers.Send(H);  //发送Soap Header
  aIntf.GetInfo;  //调用服务
finally
   aIntf := nil;
  H.Free;
End;
end;
客户端的工作就是这些了,能否调用服务还要看服务端的处理结果了。

三、   服务端接收处理Header
服务端程序片段:
function TSoapAuth.GetServerInfo: WideString;
var
   Headers: ISoapHeaders;
  H: TAuthHeader;
begin
   Headers := Self as ISoapHeaders;
  Headers.Get(TAuthHeader, TSoapHeader(H)); //先获取SoapHeader
  try
    if H = nil then  //SoapHeader 为空
      raise ERemotableException.Create('No authentication header')
    else
      if not CheckUser(H.UserName, H.PassWord) then   //验证失败
        raise ERemotableException.Create('No acess to call on service!');
  finally
     H.Free;
  end;
  Result := 'Hello World!';
end;
以上,TSoapAuth是继承于TInvokableClass 实现 ISoapAuth 的类。
CheckUser()是用来验证用户是否具有访问权限的函数,在服务端定义。
这只是个简单的返回字符串的服务。

四、   对访问WebService的用户的状态的探讨
事实上客户端在每次调用服务端的服务接口时会重新生成一个对象,发送请求,然后接收返回结果,整个调用过程结束后这个对象就被释放。所以可以说WebService是个无状态的对象,也就不存在用户是否登陆的说法。这样的结果使得我们每次调用服务时就必须做一次用户认证(这个认证可能是查询数据库比对),是比较浪费时间和资源的。
如果一定要在服务端保存用户的登陆状态,那么可以在服务端加一个LogIn()的函数。当用户第一次访问服务时,调用LogIn()记录下用户的状态信息,并且赋给这个用户在一段时间内无限制(是指不必经过CheckUser这个过程)访问服务的权限,当这段时间过后,用户的登陆状态被释放掉,必须重新登陆才能继续调用服务。
至于这个用户状态信息如何在服务端保存,就可能有几种方法了。一是用文件形式保存(xml或ini),二是数据库保存,三是用程序中的变量保存(可以在程序中定义一个UserList的变量来记录用户的状态信息)。

转载于:https://www.cnblogs.com/lzj1981/archive/2013/05/01/3053234.html

Delphi实现WebService带身份认证的数据传输相关推荐

  1. 使用telnet登陆smtp服务发邮件(带身份验证)

    这几天做邮件发送的小程序,顺便查了一下为什么126.gmail等smtp邮件服务器,都不能使用实验课上的smtp指令发送邮件,当时根据返回信息,只知道服务器需要身份认证. 今天终于找出了telnet ...

  2. 字符串 hash 唯一数字_【数字课堂】酒妹带你了解“身份认证技术”

    身份认证技术是在计算机网络中确认操作者身份的过程而产生的有效解决方法.计算机网络世界中一切信息包括用户的身份信息都是用一组特定的数据来表示的,计算机只能识别用户的数字身份,所有对用户的授权也是针对用户 ...

  3. java 发送带basic认证的http post请求实例代码_图解HTTP学习笔记(八)—确认访问用户身份的认证...

    某些 Web 页面只想让特定的人浏览,或者干脆仅本人可见.为达到这个目标,必不可少的就是认证功能. 一.认证 核对登录者本人才知道的信息: 密码.动态令牌.数字证书.生物认证.IC卡等 HTTP 使用 ...

  4. Asp.net core 身份认证框架 Microsoft Identity的使用以及如何使用Idengtity创建自带的用户模型SignInManager和UserManager的使用等等

    要启动身份认证组件,首先要更改数据库上下文中继承的关系,原本我们是继承于 Dbcontext这个类,现在我们需要继承IdentityDbContext 继承这个类,我们需要安装对应的框架, 如图: 这 ...

  5. STIR/SHAKEN 呼叫的身份认证带外传输

    CHAKEN方案使用带外传输方式传送可信呼叫信息:STIR/SHAKEN基本协议基于核心网部署,存在因中间网段不支持SIP协议或数据报文丢失等原因无法成功传输呼叫身份的情况,其同样采用带外传输作为解决 ...

  6. jws webservice 跳过https认证_基于OAuth2的OIDC (OpenId Connect)身份认证

    OIDC协议 OIDC(OpenID Connect)是在OAuth2上构建了一个身份层,是一个基于OAuth2协议的身份认证标准协议. OAuth2协议 OAuth2是一个授权协议,它无法提供完善的 ...

  7. 网络安全(1)-身份认证

    网络数据安全 现在在网络上两个节点A和B之间进行通信的时候,数据包经过的路径上很有可能会有很多的路由节点.在这些中间路由节点上,A和B之间的IP包是完全可以被截获.修改.甚至丢弃的,因此在网络上的数据 ...

  8. 网页登陆安全身份认证(I KEY1000)

    IKEY 1000 概述 彩虹公司的iKey1000是基于USB的双因素认证令牌,可以很方便的集成到多种应用程序和网络服务中:比如虚拟专用网(VPN).公司内部网.外部网和互联网的访问.同时iKey1 ...

  9. 超级狗是集软件授权、课件保护和身份认证于一身的加密狗。

    超级狗是加密狗家族中最新一代软件保护和授权产品.它提供了强大的软件.课件防盗版功能以及灵活的软件授权功能,保护软件开发商的知识产权与核心技术,确保开发商的市场收入. 超级狗将软件保护与授权技术化繁为简 ...

最新文章

  1. 统计学原理-----概率分布
  2. POJ1552-Doubles
  3. rsync与inotify实现数据实时同步
  4. 在vSphere Client中启动虚拟机创建进程以及VMwareTools安装
  5. 【算法学习笔记】19.算法设计初步 最大子列和问题的几种方法
  6. SpingBoot 整合 kafka Elk
  7. jQuery 计时器(jquery timers)简单应用
  8. Excel 导入 Sql Server出错——“文本被截断,或者一个或多个字符在目标代码页中没有匹配项”错误的解决...
  9. 多线程-使线程具有有序性
  10. Kubernetes入门培训(内含PPT)-(转)
  11. 为什么很多公司只给博士发安家费,却不给研究生和本科生发?
  12. Hibernate概述
  13. open表和closed表_什么是左外连接?左外连接在工作表查询中的应用
  14. uploadify 实现文件上传
  15. 2020-12-04Cannot Initialize Data Bindings 的问题
  16. NNT 抢任务 神器 V1.0.5
  17. 简单概括 文明进化的各个阶段 (39)
  18. 安全、性能测试常见问题与注意事项
  19. WEB在打印fr3报表上显示二维码和图片
  20. Prometheus 部署告警对接 QQ 邮箱

热门文章

  1. 无法解析 list 中的方法 iterator_Python-list中的append()和extend()方法区别
  2. 以太坊区块链同步_以太坊69:如何在10分钟内建立完全同步的区块链节点
  3. PAT(甲级)2021年春季考试 7-1 Arithmetic Progression of Primes
  4. python二叉搜索树建立_700. 二叉搜索树的搜索(Python)
  5. 背景图自适应屏幕居中显示,且不变形
  6. cglib代理的使用
  7. 刚学习了linux的DHCP 配置.呵呵.自己上来总结下.
  8. 异常-----Java compiler level does not match解决方法
  9. 【BZOJ2157】旅游
  10. 拇指接龙游戏升级记录03(升级MainScene.cpp)