https登陆 及 数字证书 检查 设计思路及解决方法总结

在一些管理严格的部门需要使用数字证书进行登陆,此时需要专门的数字证书登陆代码才行。

下面就总结一下最近做的一个项目的情况,供大家参考。

一、https 登陆的思路

先不谈网站的https配置问题,另文详细说明。 

为了减少网站代码的变化,一般网站都采用了,只有登陆页面使用https,而正常页面还是使用http方式。我的解决办法是这样的:

在iis中配置两个站点,(1)是网站代码,(2)数字证书登陆的代码;用户默认登陆使用数字证书,验证完毕后向 数据库 中 “https”中写入一个随机数(随机生成作为临时验证用的id)、当前时间和一个用户唯一标识(如身份证号),然后自动转移到(1)站点的一个专门的验证页面login_https.aspx,此页面从数据库中“https”查询随机数是否存在,在并且时间相差不超过20秒,则是正常登陆,提取用户的身份证号,到用户信息库中提取相应的登陆信息就可以完成登陆。

代码:

1)数字登陆部分(我用的是usbkey)

[vb]  view plain copy
  1.     Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load  
  2. '-------------------  
  3.     
  4.    Dim CommUrl As String = "1.1.3.4" '此处为站点(1)的ip  
  5.         Dim action, Url As String  
  6.   
  7.         Dim Pass As Boolean = False ' 验证通过  
  8.                 Dim goUrl As String  
  9.         Dim IsError As Boolean = False  
  10.         If Not Request.ClientCertificate.IsPresent Then  
  11.               
  12.             Throw New Exception("不合法用户禁止访问")  
  13.        End If  
  14.   
  15.             Dim SubjectCN As String = Request.ClientCertificate("SubjectCN")  
  16.             'Dim ary As String() = SubjectCN.Split(New Char() {" "c}, StringSplitOptions.RemoveEmptyEntries)  
  17.   
  18. Dim ary() As string = split(SubjectCN," ")  
  19.             If ary.Length <> 2 Then  
  20.                 Throw New Exception("不合法的证书!")  
  21.                   
  22.             end if  
  23.   
  24.                 Dim __UserName As String = ary(0).Trim() '用户名  
  25.         'Dim __IDCard As String ' = ary(1).Trim() '身份证号  
  26.                 
  27.   
  28.                 Dim sqlstr As String = "select uid,姓名,警号,单位编号,职务编号,Isadmin from 用户  WHERE (身份证号 = '" & ary(1) & "')"  
  29.    
  30.   
  31.                 Dim db As New db  
  32.                 db.OpenConn()  
  33.   
  34.                 
  35.                 Dim Rs As MySqlDataReader  
  36.   
  37.                 Rs = db.ExecuteSQL(sqlstr)  
  38.                 If Not Rs.HasRows Then  
  39.                         Rs.Close()  
  40.                     Throw New Exception("未发现您的用户信息")  
  41.                 
  42.                 Else  
  43.                     Rs.Close()  
  44.   
  45.                     '生成随机字符串用于登陆验证  
  46.                     Dim ssid As String = getSSID()  
  47.   
  48.                     db.ExecuteSQL("insert into https (ssid,time,身份证号) values('" & ssid & "','" & Now() & "','" & ary(1) & "')")  
  49.                     
  50. goUrl = "login_https.aspx?ssid=" & ssid  
  51.                 End If  
  52.   
  53.   
  54.                 db.CloseConn()  
  55.                 db = Nothing  
  56.      goUrl = "http://" & CommUrl & "/" & goUrl  
  57.   
  58.         '此处必须使用 页面脚本的方式,如果使用直接重定向的话,有出现“转移到不安全站”的提示  
  59.   
  60.        Response.Write("<script>location.href('" & goUrl & "')</script>")  
  61.   
  62.   
  63.   
  64.     End Sub  
  65.     Private Function getSSID() As String  
  66.         '生成一个随机的字符串  
  67.         Dim t, i As Int32  
  68.         i = 2  
  69.         Dim s, pass As String  
  70.         s = "abcdefghijklmnopqistuvwsyz1234567890" '~!@#$^&*_+=  
  71.         pass = ""  
  72.         For i = 1 To 20  
  73.             Randomize() '初始化随机数生成器。  
  74.             t = Int(Rnd() * Len(s)) + 1  
  75.             pass = pass + Mid(s, t, 1)  
  76.         Next  
  77.         Return pass  
  78.     End Function  

二、站点(1)处的验证代码login_https.aspx

[vb]  view plain copy
  1. Protected Sub Page_Load(ByVal sender As ObjectByVal e As System.EventArgs) Handles Me.Load  
  2.        Dim goUrl As String  
  3.        Dim ssid As String = Trim(Request.QueryString("ssid"))  
  4.        Dim db As New db  
  5.        Dim Rs As MySqlDataReader  
  6.        db.OpenConn()  
  7.   
  8.        Dim sqlstr As String  
  9.        Dim __IDCard As String  
[vb]  view plain copy
  1.     sqlstr = "select 身份证号,time from https  WHERE (ssid = '" & ssid & "' order by time desc )"  
  2.   
  3.     Rs = db.ExecuteSQL(sqlstr)  
  4.     If Not Rs.HasRows Then  
  5.         goUrl = "error.aspx?id=9"  
  6.         rs.close()  
  7.     Else  
  8.         Rs.Read()  
  9.         __IDCard = Rs("身份证号")  
  10.          
  11.         Rs.Close()  
  12.         '找到接着删除  
  13.         sqlstr = "delete from https where ssid='" & ssid & "';"  
  14.   
  15.         sqlstr += "select uid,姓名 from 用户  WHERE (身份证号 = '" & __IDCard & "')"  
  16.         If Not Rs.IsClosed Then  
  17.             rs.close()  
  18.         End If  
  19.         Rs = db.ExecuteSQL(sqlstr)  
  20.         If Not Rs.HasRows Then  
  21.             goUrl = "error.aspx?id=9"  
  22.             rs.close()  
  23.         Else  
  24.             Rs.Read()  
  25.             Session.Timeout = 60  
  26.             Session("uid") = CStr(Rs(0))  
  27.             Session("姓名") = Rs(1)  
  28.   
  29.   
  30.             rs.close()  
  31.             '销毁  
  32.             Session.Remove("logintime")  
  33.             Session.Remove("num")  
  34.             goUrl = "index.aspx"  
  35.         End If  
  36.         Rs.Close()  
  37.     End If  
  38.   
  39.     Response.Redirect(goUrl)  
  40.     If Rs.IsClosed Then  
  41.         Rs.Close()  
  42.     End If  
  43.   
  44.     db.CloseConn()  
  45.     db = Nothing  
  46. End Sub  

猜你喜欢

转载自blog.csdn.net/chens616/article/details/40840979