https登陸 及 數字證書 檢查 設計思路及解決方法總結
阿新 • • 發佈:2018-12-17
在一些管理嚴格的部門需要使用數字證書進行登陸,此時需要專門的數字證書登陸程式碼才行。
自動轉移到(1)站點的一個專門的驗證頁面login_https.aspx,此頁面從資料庫中“https”查詢隨機數是否存在,在並且時間相差不超過20秒,則是正常登陸,提取使用者的身份證號,到使用者資訊庫中提取相應的登陸資訊就可以完成登陸。
下面就總結一下最近做的一個專案的情況,供大家參考。
一、https 登陸的思路
先不談網站的https配置問題,另文詳細說明。
為了減少網站程式碼的變化,一般網站都採用了,只有登陸頁面使用https,而正常頁面還是使用http方式。我的解決辦法是這樣的:
在iis中配置兩個站點,(1)是網站程式碼,(2)數字證書登陸的程式碼;使用者預設登陸使用數字證書,驗證完畢後向 資料庫 中 “https”中寫入一個隨機數(隨機生成作為臨時驗證用的id)、當前時間和一個使用者唯一標識(如身份證號),然後
程式碼:
1)數字登陸部分(我用的是usbkey)
[vb] view plain copy
- Protected Sub Page_Load(sender
- '-------------------
- Dim CommUrl As String = "1.1.3.4" '此處為站點(1)的ip
- Dim
- Dim Pass As Boolean = False ' 驗證通過
- Dim goUrl As String
- Dim IsError As Boolean = False
- If Not Request.ClientCertificate.IsPresent Then
- Throw New Exception("不合法使用者禁止訪問")
- End If
- Dim SubjectCN As String = Request.ClientCertificate("SubjectCN")
- 'Dim ary As String() = SubjectCN.Split(New Char() {" "c}, StringSplitOptions.RemoveEmptyEntries)
- Dim ary() As string = split(SubjectCN," ")
- If ary.Length <> 2 Then
- Throw New Exception("不合法的證書!")
- end if
- Dim __UserName As String = ary(0).Trim() '使用者名稱
- 'Dim __IDCard As String ' = ary(1).Trim() '身份證號
- Dim sqlstr As String = "select uid,姓名,警號,單位編號,職務編號,Isadmin from 使用者 WHERE (身份證號 = '" & ary(1) & "')"
- Dim db As New db
- db.OpenConn()
- Dim Rs As MySqlDataReader
- Rs = db.ExecuteSQL(sqlstr)
- If Not Rs.HasRows Then
- Rs.Close()
- Throw New Exception("未發現您的使用者資訊")
- Else
- Rs.Close()
- '生成隨機字串用於登陸驗證
- Dim ssid As String = getSSID()
- db.ExecuteSQL("insert into https (ssid,time,身份證號) values('" & ssid & "','" & Now() & "','" & ary(1) & "')")
- goUrl = "login_https.aspx?ssid=" & ssid
- End If
- db.CloseConn()
- db = Nothing
- goUrl = "http://" & CommUrl & "/" & goUrl
- '此處必須使用 頁面指令碼的方式,如果使用直接重定向的話,有出現“轉移到不安全站”的提示
- Response.Write("<script>location.href('" & goUrl & "')</script>")
- End Sub
- Private Function getSSID() As String
- '生成一個隨機的字串
- Dim t, i As Int32
- i = 2
- Dim s, pass As String
- s = "abcdefghijklmnopqistuvwsyz1234567890" '[email protected]#$^&*_+=
- pass = ""
- For i = 1 To 20
- Randomize() '初始化隨機數生成器。
- t = Int(Rnd() * Len(s)) + 1
- pass = pass + Mid(s, t, 1)
- Next
- Return pass
- End Function
二、站點(1)處的驗證程式碼login_https.aspx
[vb] view plain copy- Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
- Dim goUrl As String
- Dim ssid As String = Trim(Request.QueryString("ssid"))
- Dim db As New db
- Dim Rs As MySqlDataReader
- db.OpenConn()
- Dim sqlstr As String
- Dim __IDCard As String
- sqlstr = "select 身份證號,time from https WHERE (ssid = '" & ssid & "' order by time desc )"
- Rs = db.ExecuteSQL(sqlstr)
- If Not Rs.HasRows Then
- goUrl = "error.aspx?id=9"
- rs.close()
- Else
- Rs.Read()
- __IDCard = Rs("身份證號")
- Rs.Close()
- '找到接著刪除
- sqlstr = "delete from https where ssid='" & ssid & "';"
- sqlstr += "select uid,姓名 from 使用者 WHERE (身份證號 = '" & __IDCard & "')"
- If Not Rs.IsClosed Then
- rs.close()
- End If
- Rs = db.ExecuteSQL(sqlstr)
- If Not Rs.HasRows Then
- goUrl = "error.aspx?id=9"
- rs.close()
- Else
- Rs.Read()
- Session.Timeout = 60
- Session("uid") = CStr(Rs(0))
- Session("姓名") = Rs(1)
- rs.close()
- '銷燬
- Session.Remove("logintime")
- Session.Remove("num")
- goUrl = "index.aspx"
- End If
- Rs.Close()
- End If
- Response.Redirect(goUrl)
- If Rs.IsClosed Then
- Rs.Close()
- End If
- db.CloseConn()
- db = Nothing
-