Single Sign On - Sharing Session State

posted on 19 Aug 2013 17:36 by inwprogramming in Programming

Session Model (C#.net)

ที่มีอยู่ 5 Mode ครับ

1. InProc mode เป็นโหมดที่ทำงานโดยเก็บข้อมูลไว้ใน RAM ของ Web Server ซึ่งเป็นโหมดพื้นฐานที่ตั้งค่ามาให้ใช้งาน

ข้อดี ง่ายและเป็นโหมดที่ทำงานได้เร็วทีสุด

ข้อเสีย แต่มีข้อจำกัดในการรองรับจำนวนข้อมูลและการแชร์ session ใน Farm และเมื่อ web server restart ทุกอย่างที่เก็บไว้ก็จะหายไปทันที

 

2. StateServer (OutProc) mode เป็น โหมดที่ทำงานโดยแยก Service ที่เป็นส่วนเสริมของ ASP.NET เองออกไปจาก IIS process ซึ่งมีชื่อว่า ASP.NET state service โดยจะมีติดตั้งให้ทันทีที่ลง .NET Framework ซึ่งจะอยู่ที่“systemroot\Microsoft.NET\Framework\versionNumber\aspnet_state.exe”

ข้อดี ด้วย ตัว state server นี้แม้หากว่า web server เกิด restart ตัวเองขึ้นมาคุณก็แน่ใจได้ว่าเซสชั่นนั้นยังคงถูกเก็บไว้อยู่แน่นอน ซึ่งเหมาะที่จะใช้สำหรับ Web Server ใน Farm และมีความเร็วในการทำงานเป็นลำดับรองจาก InProc Mode อยู่ 1 เท่าตัว

ข้อเสีย คือ กิน RAM เหมือน InProc เพราะเก็บไว้ใน RAM เหมือนกับ InProc mode เพียงแต่แยก service ออกมาต่างหาก แปลว่าคุณควรจะมีเครื่องแยกออกมาและมีช่องเสียบ RAM เยอะๆ และเสียบ RAM ไว้เพื่อรองรับงานดังกล่าว แต่เมื่อ StateServer restart ทุกเซสชั่นก็จะหายไปหมดเช่นกัน

ตัวอย่าง web.config

<configuration>
  <system.web>
    <sessionState mode="StateServer"stateConnectionString="tcpip=SampleStateServer:42424" 
                  cookieless="false" timeout="20"/>
  </system.web>
</configuration>

 

 

 

3. SQLServer mode เป็นโหมดที่เก็บเซสชั่นไว้ใน Database

ข้อดี คุณสมบัติ เหมือนกับ StateServer mode ทุกอย่าง และถึงแม้ว่า SqlServer จะ restart ข้อมูลเซสชั่นก็ยังคงถูกเก็บเอาไว้ใน Database ไม่หายไป และดีกว่าที่ว่าสามารถขยายความจุของเซสชั่นได้เท่ากับพื้นที่บน HDD ที่มีอยู่ เหมาะที่ใช้กับ Web Server ใน Farm

ข้อเสียที่ว่า ช้ากว่า InProc mode ประมาณ 3 เท่าตัว

ตัวอย่าง web.config

<configuration>
  <system.web>
    <sessionState mode="SQLServer" sqlConnectionString=
                  "Integrated Security=SSPI;data source=SQLSessionServer;" />
  </system.web>
</configuration>

 

 

*** หากต้องการจะใช้งาน SqlServer Mode คุณต้องทำการ register database ด้วย aspnet_regsql.exe ตัวนี้ก่อน

4. Custom mode หา ตัวอื่นมาใช้ทดแทนทั้ง 3 mode ที่กล่าวไปข้างต้น โดยอาจจะเก็บไว้ใน Disk, NoSql เป็นต้น ซึ่งเราจะมาพูดคุยและทดสอบใช้งานกันในตอนนี้

5. Off mode ไม่ใช้ Session (ฟังดูจะโหดร้ายไปหน่อย)

Sharing sessions across applications using the ASP.NET Session State Service

Single Sign On เมื่อเราเข้าใจเรื่องราวเกี่ยวกับ Session แล้วต่อไปต้อง ทำ Session ให้เข้าใจว่าเป็นตัวเดียวกัน(ใช้ได้เฉพาะโหมด SQLServer mode เท่านั้น)

Basically the idea is both apps use native .net sessionState stored in sqlserver. By using the same machine key and making a small tweak to a stored procedure – both apps can share any session keys and/or forms authenication.

- แก้ตรง Application Name ให้เหมือนกัน

Both apps would do something like this in there web.config:

<sessionState mode="SQLServer" 
sqlConnectionString
="Data Source=.\SQLEXPRESS;User Id=test;Password=test;
Application Name=AppName"
/> <machineKey validationKey="SOMEKEY" validation="SHA1" decryption="AES" />

 

Session state db would need to be set up on a database server, that both apps can see.

Docs for doing this: http://msdn.microsoft.com/en-us/library/ms229862(VS.80).aspx

Command that would need to be run: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin>aspnet_regsql.exe -E -ssadd --sstype p -S .\SQLEXPRESS

-แก้ Stroed procedure โดยใส่ค่านี้ลงไป

Stored procedure (TempGetAppID) tweak to:

 @appId int OUTPUT
AS

    -- start change

    -- Use the application name specified in the connection for the appname if specified
    -- This allows us to share session between sites just by making sure they have the
    -- the same application name in the connection string.
    DECLARE @connStrAppName nvarchar(50)
    SET @connStrAppName = APP_NAME()

    -- .NET SQLClient Data Provider is the default application name for .NET apps
    IF (@connStrAppName <> '.NET SQLClient Data Provider')
        SET @appName = @connStrAppName

    -- end change

SET @appName = LOWER(@appName)

 

 


enter image description here

เท่านี้ก็เรียบร้อยแล้ว

Cr. http://greatfriends.biz/webboards/msg.asp?id=130514  ,

http://stackoverflow.com/questions/2868316/sharing-sessions-across-applications-using-the-asp-net-session-state-service

Comment

Comment:

Tweet