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();
}
}
}