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的变量来记录用户的状态信息)。

Delphi实现WebService带身份认证的数据传输的更多相关文章

  1. "用户增长"--快速身份认证实现用户增长的技术和产品方案

    "用户增长"--快速身份认证实现用户增长的技术和产品方案 1   引言 作为一个互联网产品,用户量的增长是一个非常重要的衡量指标. 这是一个集合了销售,市场,运营,技术的综合能力. ...

  2. .NET Web的身份认证

    百度一下”asp.net身份认证“,你会得到很多相关的资料,这些资料通常上来就会介绍诸如”Form认证“”Windows认证“等内容,而没有给出一个完整的流程.初学者对此往往一头雾水,我也曾经被坑过很 ...

  3. RESTful Api 身份认证安全性设计

    REST是一种软件架构风格.RESTful Api 是基于 HTTP 协议的 Api,是无状态传输.它的核心是将所有的 Api 都理解为一个网络资源.将所有的客户端和服务器的状态转移(动作)封装到 H ...

  4. C#进阶系列——WebApi 身份认证解决方案:Basic基础认证

    前言:最近,讨论到数据库安全的问题,于是就引出了WebApi服务没有加任何验证的问题.也就是说,任何人只要知道了接口的url,都能够模拟http请求去访问我们的服务接口,从而去增删改查数据库,这后果想 ...

  5. 细说ASP.NET Forms身份认证

    阅读目录 开始 ASP.NET身份认证基础 ASP.NET身份认证过程 如何实现登录与注销 保护受限制的页面 登录页不能正常显示的问题 认识Forms身份认证 理解Forms身份认证 实现自定义的身份 ...

  6. 基于FormsAuthentication的用户、角色身份认证

    一般情况下,在我们做访问权限管理的时候,会把用户的正确登录后的基本信息保存在Session中,以后用户每次请求页面或接口数据的时候,拿到 Session中存储的用户基本信息,查看比较他有没有登录和能否 ...

  7. WebApi身份认证解决方案:Basic基础认证

    前言:最近,讨论到数据库安全的问题,于是就引出了WebApi服务没有加任何验证的问题.也就是说,任何人只要知道了接口的url,都能够模拟http请求去访问我们的服务接口,从而去增删改查数据库,这后果想 ...

  8. iOS - HTTPS接口加密和身份认证

    为什么要使用HTTPS代替HTTP HTTPS和HTTP的区别 https协议需要到CA申请证书,一般免费证书很少,需要交费. http是超文本传输协议,信息是明文传输,https则是具有安全性的SS ...

  9. Spark SQL Thrift Server 配置 Kerberos身份认证和权限管理

    转载请注明出处:http://www.cnblogs.com/xiaodf/ 之前的博客介绍了通过Kerberos + Sentry的方式实现了hive server2的身份认证和权限管理功能,本文主 ...

随机推荐

  1. 3、bootstrap3.0 栅格偏移 布局中的一个特产

    理解了栅格化,那么栅格偏移也相对容易理解了.v3的偏移分别有以下几种: offset:左外边距(margin-left): pull:右位移(right): push:左位移(left). 其中off ...

  2. phpstrtotime()对于31日求上个月有问题

    PHP自带的strtotime()对于31日求上个月有问题,如下: <?php $date = "2012-07-31"; $date_unix = strtotime($d ...

  3. CI框架篇之模型篇--初识(1)

    模型 模型是专门用来和数据库打交道的PHP类.例如,假设你想用CodeIgniter来做一个Blog. 你可以写一个模型类,里面包含插入.更新.删除Blog数据的方法. 下面的例子将向你展示一个普通的 ...

  4. javascript 中状态改变触发事件

    转 有限状态机:是一个非常有用的模型,可以模拟世界上大部分事物. 它有三个特征: * 状态总数(state)是有限的. * 任一时刻,只处在一种状态之中. * 某种条件下,会从一种状态转变(trans ...

  5. StarUML启动时候出现"System Error. Code:1722. RPC服务器不可用."错误的解决办法

    StarUML是用得很顺手的UML工具,但是启动时候每次都会出现"System Error. Code:1722. RPC服务器不可用."错误. 一般来说这个应该是某个Window ...

  6. js跨浏览器事件对象、事件处理程序

    项目中有时候会不用jquery这么好用的框架,需要自己封装一些事件对象和事件处理程序,像封装AJAX那样:这里面考虑最多的还是浏览器的兼容问题,原生js封装如下:var EventUtil={ //节 ...

  7. 设置lable内容不上下居中

    转载自:http://dong-zsh.github.io/2015/10/14/%E8%AE%BE%E7%BD%AElable%E5%86%85%E5%AE%B9%E4%B8%8D%E4%B8%8A ...

  8. C# json与对象之间的相互转换

    1. 添加命名空间 using System.Runtime.Serialization.Json; 2. WriteObject方法 // 从一个对象信息生成Json串 public static ...

  9. C#后台程序与HTML页面中JS方法互调

    此方法适用于 C#中嵌入WebBrowser(浏览器) 通过浏览器中加载的页面与C#的后台代码进行交互. 一.C#程序 1.在C#窗体中添加WebBrowser(浏览器),将页面的URL添加到浏览器中 ...

  10. css sprites精灵技术:Html将所有图片放在一张图片上

    使用最近做的某项目常见页面作为联系素材: 分析:1.切图:步骤条可以切成四种图,即黄灰.红黄.红.灰. 2.html:需要五个li标签,每个包含一个图片及文字. 将要取得图片放到同一张图片上,从左到右 ...