1. 程式人生 > >https登陸 及 數字證書 檢查 設計思路及解決方法總結

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" '[email protected]#$^&*_+=  
  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