單一簽入 SSO by QueryString Part 2
上回提到透過QueryString達到SSO的功能, 在實際運用後整理出一些心得
此次加入加密機制及登出機制, 請享用!
SSO1.ASPX (A專案)
Public Class SSO1
Inherits System.Web.UI.Page
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'在這裡放置使用者程式碼以初始化網頁
Session("username") = "Spark"
Session("email") = "spark@sso.com"
Session("userid") = 2
Session("sex") = "M"
Session("DestPage") = "http://www.dotblogs.com.tw/spark/Default.aspx"
Dim SSOKey = "SSOTEST" '加密KEY
Dim SSOCount = "2" '專案數
Dim SSONexturl = "SSO2.ASPX" '下一專案
If Trim("" & Request.QueryString("logout")) = "1" Then
'SSO登出次數加1
Dim sso_times As Integer = CInt(Trim("" & Request.QueryString("sso_times"))) + 1
'清除此專案所有session
Session.Clear()
'當SSO登出次數達專案數即代表全數登出
If sso_times >= SSOCount Then
Response.Redirect(Session("DestPage").ToString)
Else
Response.Redirect(SSONexturl & "?logout=1&sso_times=" & sso_times)
End If
Else
'若有Session加密資料傳入,則解密
For i As Integer = 0 To Request.Form.Count - 1
Dim objdata As String = Crypt.Decrypt(Request.Form(i).ToString(), SSOKey)
Session(Request.Form.GetKey(i)) = objdata
Next
'SSO登入次數加1
Session("sso_times") = Session("sso_times") + 1
'當SSO登入次數達專案數即代表全數登入
If Session("sso_times") >= SSOCount Then
If Trim("" & Session("bp")) = "" Then
Response.Redirect(Session("DestPage").ToString)
Else
Response.Redirect(Session("bp").ToString)
End If
Else
'將所有的Session加密後傳送至下個專案
Response.Write("<form name=t id=t action='" & SSONexturl & "' method=post >")
For i As Integer = 0 To Session.Contents.Count - 1
Dim str As String = Trim("" & Session.Contents(Session.Keys(i).ToString))
'加密
Dim objdata As String = Crypt.EncryptStr(str, SSOKey)
Response.Write("<input type=hidden name=" & Session.Keys(i).ToString)
Response.Write(" value=" & objdata & " >")
Next
Response.Write("<input type=submit name=button value='sso' style='display:none'>")
Response.Write("</FORM>")
Response.Write("<SCRIPT language='JavaScript'>document.t.submit();</script>")
End If
End If
End Sub
End Class
Inherits System.Web.UI.Page
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'在這裡放置使用者程式碼以初始化網頁
Session("username") = "Spark"
Session("email") = "spark@sso.com"
Session("userid") = 2
Session("sex") = "M"
Session("DestPage") = "http://www.dotblogs.com.tw/spark/Default.aspx"
Dim SSOKey = "SSOTEST" '加密KEY
Dim SSOCount = "2" '專案數
Dim SSONexturl = "SSO2.ASPX" '下一專案
If Trim("" & Request.QueryString("logout")) = "1" Then
'SSO登出次數加1
Dim sso_times As Integer = CInt(Trim("" & Request.QueryString("sso_times"))) + 1
'清除此專案所有session
Session.Clear()
'當SSO登出次數達專案數即代表全數登出
If sso_times >= SSOCount Then
Response.Redirect(Session("DestPage").ToString)
Else
Response.Redirect(SSONexturl & "?logout=1&sso_times=" & sso_times)
End If
Else
'若有Session加密資料傳入,則解密
For i As Integer = 0 To Request.Form.Count - 1
Dim objdata As String = Crypt.Decrypt(Request.Form(i).ToString(), SSOKey)
Session(Request.Form.GetKey(i)) = objdata
Next
'SSO登入次數加1
Session("sso_times") = Session("sso_times") + 1
'當SSO登入次數達專案數即代表全數登入
If Session("sso_times") >= SSOCount Then
If Trim("" & Session("bp")) = "" Then
Response.Redirect(Session("DestPage").ToString)
Else
Response.Redirect(Session("bp").ToString)
End If
Else
'將所有的Session加密後傳送至下個專案
Response.Write("<form name=t id=t action='" & SSONexturl & "' method=post >")
For i As Integer = 0 To Session.Contents.Count - 1
Dim str As String = Trim("" & Session.Contents(Session.Keys(i).ToString))
'加密
Dim objdata As String = Crypt.EncryptStr(str, SSOKey)
Response.Write("<input type=hidden name=" & Session.Keys(i).ToString)
Response.Write(" value=" & objdata & " >")
Next
Response.Write("<input type=submit name=button value='sso' style='display:none'>")
Response.Write("</FORM>")
Response.Write("<SCRIPT language='JavaScript'>document.t.submit();</script>")
End If
End If
End Sub
End Class
SSO2.ASPX (B專案)
Public Class SSO2
Inherits System.Web.UI.Page
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'在這裡放置使用者程式碼以初始化網頁
Dim SSOKey = "SSOTEST"
Dim SSOCount = "2"
Dim SSONexturl = "SSO1.ASPX"
If Trim("" & Request.QueryString("logout")) = "1" Then
'SSO登出次數加1
Dim sso_times As Integer = CInt(Trim("" & Request.QueryString("sso_times"))) + 1
'清除此專案所有session
Session.Clear()
'當SSO登出次數達專案數即代表全數登出
If sso_times >= SSOCount Then
Response.Redirect(Session("DestPage").ToString)
Else
Response.Redirect(SSONexturl & "?logout=1&sso_times=" & sso_times)
End If
Else
'若有Session加密資料傳入,則解密
For i As Integer = 0 To Request.Form.Count - 1
Dim objdata As String = Crypt.Decrypt(Request.Form(i).ToString(), SSOKey)
Session(Request.Form.GetKey(i)) = objdata
Next
Response.Write("<br>" & Session("username").ToString)
Response.Write("<br>" & Session("email").ToString)
Response.Write("<br>" & Session("userid").ToString)
Response.Write("<br>" & Session("sex").ToString)
Response.Write("<br>" & Session("DestPage").ToString)
'SSO登入次數加1
Session("sso_times") = Session("sso_times") + 1
'當SSO登入次數達專案數即代表全數登入
If Session("sso_times") >= SSOCount Then
If Trim("" & Session("bp")) = "" Then
Response.Redirect(Session("DestPage").ToString)
Else
Response.Redirect(Session("bp").ToString)
End If
Else
'將所有的Session加密後傳送至下個專案
Response.Write("<form name=t id=t action='" & SSONexturl & "' method=post >")
For i As Integer = 0 To Session.Contents.Count - 1
Dim str As String = Trim("" & Session.Contents(Session.Keys(i).ToString))
'加密
Dim objdata As String = Crypt.EncryptStr(str, SSOKey)
Response.Write("<input type=hidden name=" & Session.Keys(i).ToString)
Response.Write(" value=" & objdata & " >")
Next
Response.Write("<input type=submit name=button value='sso' style='display:none'>")
Response.Write("</FORM>")
Response.Write("<SCRIPT language='JavaScript'>document.t.submit();</script>")
End If
End If
End Sub
End Class
Inherits System.Web.UI.Page
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'在這裡放置使用者程式碼以初始化網頁
Dim SSOKey = "SSOTEST"
Dim SSOCount = "2"
Dim SSONexturl = "SSO1.ASPX"
If Trim("" & Request.QueryString("logout")) = "1" Then
'SSO登出次數加1
Dim sso_times As Integer = CInt(Trim("" & Request.QueryString("sso_times"))) + 1
'清除此專案所有session
Session.Clear()
'當SSO登出次數達專案數即代表全數登出
If sso_times >= SSOCount Then
Response.Redirect(Session("DestPage").ToString)
Else
Response.Redirect(SSONexturl & "?logout=1&sso_times=" & sso_times)
End If
Else
'若有Session加密資料傳入,則解密
For i As Integer = 0 To Request.Form.Count - 1
Dim objdata As String = Crypt.Decrypt(Request.Form(i).ToString(), SSOKey)
Session(Request.Form.GetKey(i)) = objdata
Next
Response.Write("<br>" & Session("username").ToString)
Response.Write("<br>" & Session("email").ToString)
Response.Write("<br>" & Session("userid").ToString)
Response.Write("<br>" & Session("sex").ToString)
Response.Write("<br>" & Session("DestPage").ToString)
'SSO登入次數加1
Session("sso_times") = Session("sso_times") + 1
'當SSO登入次數達專案數即代表全數登入
If Session("sso_times") >= SSOCount Then
If Trim("" & Session("bp")) = "" Then
Response.Redirect(Session("DestPage").ToString)
Else
Response.Redirect(Session("bp").ToString)
End If
Else
'將所有的Session加密後傳送至下個專案
Response.Write("<form name=t id=t action='" & SSONexturl & "' method=post >")
For i As Integer = 0 To Session.Contents.Count - 1
Dim str As String = Trim("" & Session.Contents(Session.Keys(i).ToString))
'加密
Dim objdata As String = Crypt.EncryptStr(str, SSOKey)
Response.Write("<input type=hidden name=" & Session.Keys(i).ToString)
Response.Write(" value=" & objdata & " >")
Next
Response.Write("<input type=submit name=button value='sso' style='display:none'>")
Response.Write("</FORM>")
Response.Write("<SCRIPT language='JavaScript'>document.t.submit();</script>")
End If
End If
End Sub
End Class
另外建議在ASPX頁面加入以下程式碼以防止使用者關閉Javascript造成此功能無法運作
<meta http-equiv="Refresh" content="1;url=sso.aspx?logout=1&sso_times=0">
<noscript><center>很抱歉,您的瀏覽器不支援Javascript<br>您必需先開啟JavaScript支援或安裝支援JavaScript的瀏覽器方能正常使用本網站</center></noscript>
<noscript><center>很抱歉,您的瀏覽器不支援Javascript<br>您必需先開啟JavaScript支援或安裝支援JavaScript的瀏覽器方能正常使用本網站</center></noscript>
-----------------------
Share is Power