โครงการ Single SignOn และ Global Session

เนื่องจากปัจจุบันการเขียนโปรแกรม Web Application ได้แยกโปรแกรมการทำงานเป็น Web Server หลายๆ เครื่อง เพื่อลดและแยกภาระงานของ Server แต่ละเครื่อง รวมทั้งการใช้โปรแกรมคนละเทคโนโลยี เช่น ASP, ASP.NET,PHP,JSP หรือ เว็ปโปรแกรมอื่นๆ จึงแยก Sever ออกเป็นหลายๆ เครื่อง ต่อมาได้มีความต้องการเชื่อมโยงการทำงานและข้อมูลข้ามโปรแกรม เช่น การ Login เพียงครั้งเดียว หรือต้องการให้มีการส่งค่าตัวแปรระหว่าง โปรแกรม ซึ่งอาจอยู่ใน Server เดียวกันหรืออาจจะคนละ Server ก็ได้
ในกรณีที่อยู่ใน Server เดียวกันและใช้โปรแกรมเทคโนโลยีเดียวกัน สามารถใช้ตัวแปร Session หรือ Cookie ในการเชื่อมโยงการทำงานและข้อมูลข้ามโปรแกรมในแบบ Multi-User ได้ แต่ในกรณีอื่นยังทำได้ยากอยู่
โครงการนี้ใช้แนวคิด Web-Service และ XML ในการจัดทำ โดยกำหนดให้ Server นี้ (www3.diw.go.th) เป็นศูนย์กลางในการเก็บสถานะการ Login และเก็บค่าตัวแปรต่างๆ โดยอ้างอิงผ่าน SessionID ซึ่งแต่ละโปรแกรมจะต้องเก็บค่านี้สำหรับแต่ละ User ที่ Login เข้าสู่โปรแกรมไว้ตลอด จนกว่าจะ Logout ตัวอย่างเช่น เขียนโปรแกรมเก็บค่า SessionID ไว้ใน cookie ที่อ้างอิง Domain เดียวกัน
นอกจากนี้ยังใช้สำหรับเป็นศูนย์กลางการเผยแพร่ข่าวสารเมื่อผู้ใช้ Login เข้าสู่ระบบ และศูนย์กลางการกำหนดสิทธิ์ในการใช้โปรแกรม โดยตรวจสอบจากชื่อ Policy ตามหลักการและชื่อตาม Link นี้ http://www3.diw.go.th/Policy.asp
    Web-Service ที่เปิดให้บริการในปัจจุบันนี้ มีดังนี้
  • http://www3.diw.go.th/CleanSession.asp   ใช้สำหรับล้างค่า Session ที่ไม่ได้ใช้นานเกินกำหนด
  • http://www3.diw.go.th/SetSession.asp?SessionID=&KeyName=&KeyValue=   ใช้สำหรับกำหนดค่าตัวแปร
  • http://www3.diw.go.th/GetSession.asp?SessionID=&KeyName=   ใช้สำหรับหาค่าตัวแปร
  • http://www3.diw.go.th/GetAllSession.asp?SessionID=   ใช้สำหรับหาค่าตัวแปรทั้งหมด
  • http://www3.diw.go.th/EndSession.asp?SessionID=   ใช้สำหรับยกเลิก Session
  • http://www3.diw.go.th/LoginAdmin.asp?Login=&Passwd=&IP=   ใช้สำหรับเจ้าหน้าที่ Login
  • http://www3.diw.go.th/CheckAdmin.asp?SessionID=   ใช้สำหรับตรวจสอบเจ้าหน้าที่
  • http://www3.diw.go.th/LogoutAdmin.asp?SessionID=   ใช้สำหรับเจ้าหน้าที่ Logout
  • http://www3.diw.go.th/PasswdAdmin.asp?SessionID=&oPasswd=&nPasswd=   ใช้สำหรับเปลี่ยน Password เจ้าหน้าที่
  • http://www3.diw.go.th/InfoAdmin.asp?Login=   ใช้สำหรับดูข้อมูลเจ้าหน้าที่
  • http://www3.diw.go.th/CheckPolicy.asp?SessionID=&Policy=   ใช้สำหรับตรวจสอบสิทธิ์การใช้งาน
  • ซึ่งสามารถดูตัวอย่างการใช้ และผลลัพธ์ XML ตาม Link นี้

สำหรับโปรแกรมที่ใช้เทคโนโลยี ASP ได้จัดทำ include file ซึ่งมี Function สำเร็จรูป สามารถเรียกใช้ Web-Service และนำไปปรับปรุงโปรแกรมเดิมเพียงเล็กน้อยเพื่อให้ใช้งานได้ทันที (ไฟล์ "Session.inc") โดยมีข้อจำกัดคือ Browser ต้องรองรับ Cookie และต้องเรียก Server โดยใช้ Domain "diw.go.th" เช่น http://anyname.diw.go.th/anyfolder/anypage.asp
    ฟังก์ชั่นใน Session.inc ที่สามารถเรียกใช้งานได้มีดังนี้
  • function markup(str)
  • function RadomSessionID(length)
  • function CleanSession()
  • function EndSession()
  • function CheckAdmin() 'ผลลัพธ์ true=เป็นเจ้าหน้าที่ ;false=ไม่ใช่เจ้าหน้าที่
  • function SetSession(KeyName,KeyValue)
  • function SetAllSession()
  • function GetAllSession()
  • function GetSession(KeyName) 'ผลลัพธ์ KeyValue
  • function LoginAdmin(Login,passwd) 'ผลลัพธ์ 0=login สำเร็จ ;1=ไม่พบ user ;2=passwd ไม่ถูก
  • function LogoutAdmin() 'ผลลัพธ์ true=สำเร็จ ;false=ไม่สำเร็จ
  • function PasswdAdmin(oPasswd,nPasswd) 'ผลลัพธ์ 0=สำเร็จ ;1=ไม่สำเร็จยังไม่ได้ login ;2=ไม่สำเร็จ password เดิมไม่ถูก
  • function InfoAdmin(Login,Field) 'Field=Name,Admin,Id_Emp,Id_Org,Id_SOrg,Levels or Login (case sensitive)
  • function GetGlobalSession(GlobalSession,KeyName) 'ผลลัพธ์ KeyValue
  • function SetGlobalSession(GlobalSession,KeyName,KeyValue)
  • function CheckPolicy(PolicyName) 'ผลลัพธ์ true=มีสิทธิ์ใช้ ;false=ไม่มีสิทธิ์ใช้
      วิธีการปรับปรุงโปรแกรมเดิมมีดังนี้
    1. นำไฟล์ "Session.inc" ไปเก็บไว้ใน root ของ Web Server ที่ใช้งาน เช่น C:\inetpub\wwwroot\
    2. เปลี่ยนวิธีการ Login ให้เป็น Web-service (เปลี่ยนไฟล์ "Login2.asp" ใน "\util\" ของโปรแกรม)
    3. เพิ่ม ที่หัวไฟล์ในทุกหน้าที่คาดว่ามีการอ้างถึง(href) จากโปรแกรมอื่น

    4. - สำหรับหน้าที่มีการอ้างถึงแต่ไม่มีการตรวจสอบ Session (เช่น หน้า "menu.asp") ให้เพิ่มบรรทัด <% GetAllSession %> ที่ด้านบนด้วย เพื่อให้มีการถ่ายโอนค่าตัวแปร Session ทั้งหมดสู่ Local Server
      - สำหรับหน้าที่มีการอ้างถึงและมีการตรวจสอบ Session (เช่น <% if Session("Login")="" Then Response.redirect "util/login.asp") %>
        ให้ทำการแก้ไขบรรทัดดังกล่าวเป็น <% if not CheckAdmin Then Response.redirect "util/login.asp") %>
    5. สำหรับการกำหนดตัวแปร Session ให้สามารถเรียกใช้ข้ามเครื่อง Server ได้ ให้ใช้คำสั่ง <% SetSession(KeyName,KeyValue) %> (เพิ่ม include file ก่อน) ส่วนการใช้งานสามารถใช้ตัวแปร Session ได้เหมือนเดิม เช่น <% KeyValue=Session("KeyName") %>
    6. การส่งต่อค่า Session จากเครื่องหนึ่งไปยังอีกเครื่องหนึ่ง ให้ใช้คำสั่ง <% SetAllSession%>ที่เครื่องแรก และ <% GetAllSession%> ที่เครื่องเป้าหมาย ตามลำดับ
    ชื่อผู้ใช้ :
    รหัสผ่าน :

    กรณีการเปลี่ยนรหัสผ่านใหม่
    รหัสผ่านใหม่ :
    ป้อนอีกครั้ง :
    login :   name :