13590--北极燕鸥


   博采众长,信誉卓著

导航

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

Posted on 2007-04-09 16:29  北极燕鸥  阅读(2100)  评论(2编辑  收藏  举报
 

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

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

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

 

一、前言

最近在做一个身份识别系统,各个业务系统需要把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。系统会自动生成类Service1HelloWorld服务。在解决方案资源管理器里面修改Service1.asmxAuthenticate.asmx。注意还要修改Authenticate.asmx.cs文件的类名称和Authenticate.asmxClass名。

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

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(注:WSDLWeb Service描述语言,就是描述XML Web服务的标准XML格式)。点击UserAuth链接可以调用刚才写的Web认证服务和查看SOAP注:SOAPSimple Object Access Protocol,简单对象访问协议)请求示例。

三、客户端调用

()Delphi调用

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


3 导入WSDL向导

点击下一步、完成,系统会自动生成Authenticate单元。在Unit1.pasuses里添加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);

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

()ASP调用

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

建立文件default.aspinvoke.aspdefault.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 ServiceWindows 2003 WebSp1+VS.Net 2005(C#)的环境下开发,客户端在Windows 2003 WebSp1+Delphi 7.0的环境下开发,ASP通过记事本开发。Web服务器采用的是IIS6.0,测试通过。Web Service可以发布到不同的机器上,客户端调用是要注意修改客户端的调用Web Service IP地址。