通过Web Services实现统一身份识别
摘 要 本文介绍以C#写的Web Services提供身份识别服务,供其它业务平台调用。利用Web Services的通用性,充分利用现有资源,避免系统重新建设。
关键字 Web Services,调用,Delphi,Asp,身份识别
一、前言
最近在做一个身份识别系统,各个业务系统需要把USB Key的用户信息统一提交到认证服务系统中进行身份识别。身份通过后才能使用各业务系统。鉴于业务系统是采用不同的语言,不同架构开发的。考虑到系统的通用性,我们采用Web Services提供身份识别服务,供各业务系统调用。
具体实现流程是,客户端程序读取用户硬件USB KEY里的个人信息(即加密认证信息),提交给各业务系统服务器,业务系统服务器收到认证信息,转交给认证服务器进行认证,认证服务器通过身份识别后,给业务系统返回XML信息,业务系统通过解析返回的XML信息判断用户是否合法有效,建立起用户和业务系统的信任通道。如图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地址。