using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using DataLibrary; using System.Data; using EncryptDecryptEngine; using System.Globalization; namespace SingleSignOn { public partial class Default : System.Web.UI.Page { /// /// รับ argument จาก query string ทั้งหมด 4 ตัว /// 1. ss คือ session id /// 2. ref คือ reference url /// 3. vdir คือ virtual directory /// 4. cid คือ connection index /// /// /// protected void Page_Load(object sender, EventArgs e) { // หา session id จาก request string sessionId = ""; try { sessionId = Request["ss"].Trim(); } catch { sessionId = ""; } // ถ้าไม่เจอ sessionId ให้หยุดการทำงาน ถ้าเจอให้ Decrypt if (string.IsNullOrEmpty(sessionId)) { return; } else { sessionId = Decryption.SessionFormat(sessionId); } // หา ref url พร้อมตรวจความถูกต้อง เพื่อจะ redirect กลับไปเมื่อหา token สำเร็จ string refRedirectUrl = ""; try { refRedirectUrl = Decryption.UrlFormat(Request["ref"].Trim()); } catch { refRedirectUrl = ""; } // ถ้าไม่เจอ ref url หรือรูปแบบไม่ถูกต้อง ให้หยุดการทำงาน if (string.IsNullOrEmpty(refRedirectUrl)) { return; } // หา virtual directory จาก request ถ้าไม่เจอให้ตั้งค่า default เป็น CORE string vDir = "ICORE"; try { vDir = Request["vdir"]; if (string.IsNullOrEmpty(vDir)) { vDir = "ICORE"; } } catch { vDir = "ICORE"; } // หาค่า connection index จาก Request ถ้าไม่เจอให้คั้งค่าเป็น 0 int connectionIndex = 0; try { connectionIndex = int.Parse(Request["cid"]); } catch { connectionIndex = 0; } // set session connection index, virtual directory และ session id Session["connection_index"] = connectionIndex; Session["virtual_directory"] = vDir; Session["session_id"] = sessionId; Session["reference_url"] = refRedirectUrl; // หาค่า token จาก Cookie ถ้าไม่เจอให้ตั้งเป็นค่าว่าง string token = ""; try { token = Request.Cookies["tkid"].Value.Trim(); } catch { token = ""; } // หาค่า virtual directory จาก Cookie ถ้าไม่เจอให้ตั้งเป็นค่าว่าง string cvDir = ""; try { cvDir = Request.Cookies["cvdir"].Value.Trim(); } catch { cvDir = ""; } // เช็ค virtual directory จาก cookie กับ request ถ้าไม่ตรงกันให้ redirect ไปหน้า Login if (cvDir != vDir) { Response.Redirect("Login.aspx?vdir=conflict"); } // ถ้า token เป็นค่าว่างให้ redirect ไปหน้า login if (string.IsNullOrEmpty(token)) { Response.Redirect("Login.aspx?tid=null"); } // สร้าง fullpath ของโฟลเดอร์ GCOOP Session["currentDir"] = HttpContext.Current.Request.MapPath("~/").Substring(0, 1); string gcoopPath = Session["currentDir"]+":\\ICOOP_ALL\\" + vDir + "\\ICOOP\\"; // สร้าง object xml เป็นตัวแปร local XmlConfigService xml = new XmlConfigService(gcoopPath); Session.Timeout = xml.SavLoginTimeout; // ดึงตาราง Connection Strings จากไฟล์ xml DataTable dtConn = xml.ConnectionStringData; // หาค่า connection string จากตาราง ถ้าไม่เจอให้ทำเป็นค่าว่าง string connectionString = ""; try { connectionString = dtConn.Rows[connectionIndex]["connection_string"].ToString().Trim(); } catch { connectionString = ""; } // ถ้า connection string เป็นค่าว่างให้ redirect ไปหน้า login if (string.IsNullOrEmpty(connectionString)) { Response.Redirect("Login.aspx?conn=null"); } // ประกาศ object ta และทำการเชื่อมต่อ database ถ้าเชื่อมต่อไม่ได้ให้ redirect ไปหน้า Login Sta ta = null; try { ta = new Sta(connectionString); } catch { // ก่อนจะ redirect ต้องปิดการเชื่อมต่อด้วย try { ta.Close(); } catch { } Response.Redirect("Login.aspx?conn=false"); } // นำเวลาปัจจุบันใส่ตัวแปรเพื่อนำไปใช้ ลบ และ update token DateTime timeNow = DateTime.Now; String dtDisCut = "to_date('" + timeNow.ToString("yyyy-MM-d H:m:s", new CultureInfo("en-US")) + "', 'yyyy-mm-dd hh24:mi:ss')"; // ลบ token ที่ไม่ได้ทำรายการนานกว่ากำหนดใน xmlconfig try { int timeOut = xml.SSOTimeOutLogon; timeOut = (timeOut == 0 ? 60 : timeOut) * -1; String dtCut = "to_date('" + timeNow.AddMinutes(timeOut).ToString("yyyy-MM-d H:m:s", new CultureInfo("en-US")) + "', 'yyyy-mm-dd hh24:mi:ss')"; String sqlDelete = "delete from ssotoken where last_try < " + dtCut; ta.Exe(sqlDelete); } catch { } // ค้นหา token ถ้าพบให้ redirect กลับไปหน้า ref request และ update ค่าใหม่เพื่อให้ ref request นำไปค้นเพื่อใช้งาน // ถ้าไม่พบ token ให้ redirect ไปหน้า login string sql = "select * from ssotoken where token_id = '" + token + @"'"; Sdt dt = ta.Query(sql); if (dt.Next()) { string newPassword = DateTime.Now.ToString("yyMMddHHmmssffff"); string sqlUpdate = @" update ssotoken set session_id = '" + sessionId + @"', token_password = '" + newPassword + @"', token_lock = 1, last_try = " + dtDisCut + @" where token_id = '" + token + "'"; ta.Exe(sqlUpdate); // ก่อนจะ redirect ต้องปิดการเชื่อมต่อด้วย ta.Close(); Response.Redirect(refRedirectUrl + "?p=" + Encryption.SessionFormat(newPassword) + "&c=" + connectionIndex); } else { // ก่อนจะ redirect ต้องปิดการเชื่อมต่อด้วย try { ta.Close(); } catch { } Response.Redirect("Login.aspx?tid=expire"); } ta.Close(); } } }