您的位置:首页 > 其它

通过Web Services实现统一身份识别

2007-04-09 16:29 309 查看
通过Web Services实现统一身份识别

摘 要 本文介绍以C#写的Web Services提供身份识别服务,供其它业务平台调用。利用Web Services的通用性,充分利用现有资源,避免系统重新建设。

关键字 Web Services,调用,Delphi,Asp,身份识别

一、前言

最近在做一个身份识别系统,各个业务系统需要把USB Key的用户信息统一提交到认证服务系统中进行身份识别。身份通过后才能使用各业务系统。鉴于业务系统是采用不同的语言,不同架构开发的。考虑到系统的通用性,我们采用Web Services提供身份识别服务,供各业务系统调用。

具体实现流程是,客户端程序读取用户硬件USB KEY里的个人信息(即加密认证信息),提交给各业务系统服务器,业务系统服务器收到认证信息,转交给认证服务器进行认证,认证服务器通过身份识别后,给业务系统返回XML信息,业务系统通过解析返回的XML信息判断用户是否合法有效,建立起用户和业务系统的信任通道。如图1。



图1 身份识别流程图

由于Web Services的规范性和通用性,身份识别系统就具有相对独立性,可以方便的扩展业务系统,统一实现了各复杂业务平台的身份识别。对现有业务系统不需要做太多的修改,充分利用现有资源。

二、建立Web Service认证服务

VS.Net 2005(C#)建立Web Service非常简单、高效,我们选用它来建立我们的身份识别服务。

打开VS.Net 2005,打开File|New|Project,选择模板ASP.NET Web Service Application,项目名取为Authentication。系统会自动生成类Service1和HelloWorld服务。在解决方案资源管理器里面修改Service1.asmx为Authenticate.asmx。注意还要修改Authenticate.asmx.cs文件的类名称和Authenticate.asmx的Class名。

具体实现代码如下(加粗部分为新增):

namespace Authentication

{

public struct ResultInfo

{

public string Code;//返回错误代码

public string CardType;//卡类别

public string UserName;//用户姓名

public string UserID;//用户身份证号

}

/// <summary>

/// 身份识别服务

/// </summary>

[WebService(Namespace = "http://www.13590.com/")]//改写名字空间

[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

[ToolboxItem(false)]

public class Authenticate : System.Web.Services.WebService

{

private ResultInfo _resultinfo;

public Authenticate()

{

//构造函数,初始化化返回值

_resultinfo.Code = string.Empty;

_resultinfo.UserName = string.Empty;

_resultinfo.UserID = string.Empty;

_resultinfo.CardType = string.Empty;

}

//身份识别方法,根据自己的需要加入业务逻辑

private void AssignValues(string AuthID)

{

……

//加入业务逻辑,本事例直接返回固定值,姓名返回提交的认证字符串

_resultinfo.Code = "0000";

_resultinfo.UserName = AuthID;

_resultinfo.UserID = "510221197703274314";

_resultinfo.CardType = "10";

}

[WebMethod(Description = "身份识别服务,AuthID为提交的认证信息",EnableSession=false)]

public ResultInfo UserAuth(string AuthID)

{

AssignValues(AuthID);

return _resultinfo;

}

}

}

所有用户都能通过http访问Web Service,在C#中可以通过使用关键字"[Web Method]"来表明这是一个Web服务。同时这个函数就显示给公众,Description标记用于描述Web Service的功能,由于我们不存储任何会话数据,我们把会话状态设为假。为了不把敏感的商业信息被公布在网上,我们把身份识别的具体方法写在方法AssignValues中。

这样,Web Service就编写完成了,编译通过后在IIS6.0发布,在浏览器里输入http://localhost/Authenticate.asmx,结果如下:



图2 身份识别服务

点击Service Description链接可以查看该Web服务的WSDL(注:WSDL为Web Service描述语言,就是描述XML Web服务的标准XML格式)。点击UserAuth链接可以调用刚才写的Web认证服务和查看SOAP(注:SOAP为Simple Object Access Protocol,简单对象访问协议)请求示例。

三、客户端调用

(一)、Delphi调用

打开delphi7,新建一个工程,保存,再打开File|New|Other|Webservices|WSDLImporter,按照步骤新建一个Service,保存。注意添加WSDL Source服务时后加“?wsdl”,如图3:



图 3 导入WSDL向导

点击下一步、完成,系统会自动生成Authenticate单元。在Unit1.pas的uses里添加Authenticate单元的引用,form1上添加Button,Edit,和 (WebServices),设置该控件属性,如图4:



图4 控件属性

注意标注红线部分,添加Button单击事件,代码如下:

procedure TForm1.Button1Click(Sender: TObject);

var

_authenticatesoap:AuthenticateSoap;

_resultinfo:ResultInfo;

begin

_authenticatesoap:=HTTPRIO1 as AuthenticateSoap;

_resultinfo:= _authenticatesoap.UserAuth(Edit5.Text);

Edit1.Text:= _resultinfo.Code;

Edit2.Text:= _resultinfo.CardType;

Edit3.Text:= _resultinfo.UserName;

Edit4.Text:= _resultinfo.UserID;

end;

编译通过,不过现在还不能正确传递参数,因为VS.Net 2005 默认是用的SoapDocumentProtocol,而Delphi 是使用的 SoapRpcProtocol,这会造成客户端传过去的字符串都变为Null。在Authenticate单元的初始化initialization加入

InvRegistry.RegisterInvokeOptions(TypeInfo(AuthenticateSoap), ioDocument);

可以解决该问题。同时为了传递中文参数,要注意把HTTPWebNode的UseUTF8InHeader属性设为True,如图4所示。

(二)、ASP调用

为了和认证服务进行交互,即调用Web Service服务,需要构造一个查看Web Service(注:地址为http://localhost/Authenticate.asmx?op=UserAuth)所看到的完全相同的SOAP请求。

建立文件default.asp和invoke.asp。default.asp代码如下:

<form id="form1" name="form1" method="post" action="invoke.asp">

输入认证信息:<input name="_AuthID" type="text" id="_AuthID" />

<input type="submit" name="Submit" value="提交" />

</form>

Invoke.asp详细代码如下:

<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%>

<% Dim strxml

Dim str

'定义soap消息 1.1版本

strxml = "<?xml version='1.0' encoding='utf-8'?>"

strxml = strxml & "<soap:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'> "

strxml = strxml & "<soap:Body> "

strxml = strxml & "<UserAuth xmlns='http://www.13590.com/'>"

strxml = strxml & "<AuthID>"&Request.Form("_AuthID")&"</AuthID>" '需要发送的认证信息

strxml = strxml & "</UserAuth>"

strxml = strxml & "</soap:Body>"

strxml = strxml & "</soap:Envelope>"

'初始化http对象

Set xmlhttp = createobject( "Microsoft.XMLHTTP")

'向指定的URL发送SOAP请求

xmlhttp.open "POST", "http://localhost/Authenticate.asmx", False 'Web Service 的地址

xmlhttp.setRequestHeader "HOST","localhost"

xmlhttp.setRequestHeader "Content-Type", "text/xml; charset=utf-8"

xmlhttp.setRequestHeader "Content-Length",LEN(strxml)

xmlhttp.setRequestHeader "SOAPAction", "http://www.13590.com/UserAuth"

xmlhttp.send (strxml)

While xmlhttp.readyState <> 4

Wend

'显示返回的XML信息,直接输出,可以通过DOMDocument解析XML信息

str = xmlhttp.ResponseText

Response.Write(str)

%>

在IIS里发布以上文件,在浏览器里运行default.asp,输入认证信息,单击提交就可以调用认证Web服务了。

四、结束语

  在身份认证服务器上加入授权模块,做好业务系统和认证服务器之间的用户联系,就可以实现一个单位业务系统的单点登录了。以上程序,Web Service在Windows 2003 Web版Sp1+VS.Net 2005(C#)的环境下开发,客户端在Windows 2003 Web版Sp1+Delphi 7.0的环境下开发,ASP通过记事本开发。Web服务器采用的是IIS6.0,测试通过。Web Service可以发布到不同的机器上,客户端调用是要注意修改客户端的调用Web Service IP地址。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: