您的位置:首页 > 编程语言 > ASP

27.6.4 验证签名后台页面(verifySign.aspx.cs)

2008-04-29 14:44 288 查看

  验证签名后台页面主要功能是验证客户端提交的签名,并解析XLML。
verifySign.aspx.cs的主要代码如下:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Xml;
using System.IO;

public partial class verifySign : System.Web.UI.Page
{
public string strUserSignedData;
public string strSrc;
CAPICOM.SignedDataClass oSignData = new CAPICOM.SignedDataClass();
public string sData1;
public string sData2;
public string sData3;
public string sData4;
public string sData5;
public string sData6;
public string sData7;
public string sData8;

protected void Page_Load(object sender, EventArgs e)
{
strUserSignedData = Request.Form["SignedData"].ToString();

try
{
oSignData.Verify(strUserSignedData, false, 0);//验证数据签名
}
catch (Exception ex)
{
Response.Redirect("err.aspx?errmsg=验证客户端签名错误:" + ex.Message);
return;
}
strSrc = oSignData.Content;//获取业务数据原文

Response.Write("<center><h1><br>您提交的数据经过了数字签名并验证通过。<br></h1></center>");

//解析业务数据原文
try
{
StringReader xmlio = new StringReader(strSrc);

XmlReader reader = XmlReader.Create(xmlio);

reader.Read();

reader.ReadStartElement("MSG");

string sDataType1 = reader.GetAttribute("Type");
reader.ReadStartElement("data1");
sData1 = reader.ReadString();
reader.ReadEndElement();

string sDataType2 = reader.GetAttribute("Type");
reader.ReadStartElement("data2");
sData2 = reader.ReadString();
reader.ReadEndElement();

string sDataType3 = reader.GetAttribute("Type");
reader.ReadStartElement("data3");
sData3 = reader.ReadString();
reader.ReadEndElement();

string sDataType4 = reader.GetAttribute("Type");
reader.ReadStartElement("data4");
sData4 = reader.ReadString();
reader.ReadEndElement();

string sDataType5 = reader.GetAttribute("Type");
reader.ReadStartElement("data5");
sData5 = reader.ReadString();
reader.ReadEndElement();

string sDataType6 = reader.GetAttribute("Type");
reader.ReadStartElement("data6");
string sData6 = reader.ReadString();
reader.ReadEndElement();

string sDataType7 = reader.GetAttribute("Type");
reader.ReadStartElement("data7");
sData7 = reader.ReadString();
reader.ReadEndElement();

string sDataType8 = reader.GetAttribute("Type");
reader.ReadStartElement("data8");
sData8 = reader.ReadString();
reader.ReadEndElement();
reader.Close();
}
catch (Exception ex)
{
Response.Write("从XML原文解析业务数据失败:" + ex.Message);
}
//以下代码把业务数据和签名数据保存到数据库,作为日后证据。
//忽略
//
}
}
客户端JS脚本的主要代码如下:
function SelectSignCert(strSerialNumber,strSubject)
{
var oStore = new ActiveXObject("CAPICOM.Store");
var oSignerCert;
oStore.Open(CAPICOM_CURRENT_USER_STORE,CAPICOM_MY_STORE,CAPICOM_STORE_OPEN_READ_ONLY | CAPICOM_STORE_OPEN_EXISTING_ONLY);
oStoreCerts = oStore.Certificates.Find(CAPICOM_CERTIFICATE_FIND_KEY_USAGE, CAPICOM_DIGITAL_SIGNATURE_KEY_USAGE, true);

for(var i=1;i<=oStoreCerts.Count;i++) //遍历个人证书
{
try
{
var oCert=oStoreCerts.Item(i);
var cerName=oCert.GetInfo(CAPICOM_CERT_INFO_SUBJECT_SIMPLE_NAME);

if( (cerName==strSubject) && (strSerialNumber==oCert.SerialNumber))
{
return oCert;
}
}
catch(e)
{
alert("SelectSignCert catch"+e);
//window.alert(e);
return null;
}
}//end for
}

function SignData(SignerCert,DataToSign)
{
var SignedResult="";
try
{
var oSignedData = new ActiveXObject("CAPICOM.SignedData");
var oSigner = new ActiveXObject("CAPICOM.Signer");
}
catch(e)
{
window.alert(e);
return SignedResult;
}

try
{
var oSignerCert = eval(SignerCert);

oSigner.Certificate = oSignerCert;
oSignedData.Content = DataToSign;//需要签名的数据
SignedResult = oSignedData.Sign(oSigner);
return SignedResult;
}
catch(e)
{
window.alert(e);
return SignedResult;
}
}
详细的代码请参考附属光盘,目录:Code/第五篇 电子商务网站应用-ASP/订单签名。订单提交即签名页面的运行效果如图所示。处理订单即验证签名页面运行效果如图所示。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: