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


     

    通过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地址。

  • 相关阅读:
    装饰器的进阶
    Django admin组件应用
    AJAX
    Cookie、Session和自定义分页
    Django中ORM介绍和字段及字段参数
    Django 框架
    Django之视图
    Django之路由系统
    Django ORM相关操作
    Django 模板语言
  • 原文地址:https://www.cnblogs.com/13590/p/705830.html
Copyright © 2020-2023  润新知