asp.net使用加密cookie代替session驗證用戶登錄狀態 源碼分享
首先 session 和 cache 擁有各自的優勢而存在. 他們的優劣就不在這里討論了.
本實例僅存儲用戶id于用戶名,對于多級權限的架構,可以自行修改增加權限字段
本實例采用vs2010編寫,vb和c#的代碼都是經過測試的;一些童鞋說代碼有問題的 注意下
什么? 你還在用vs2008 vs2005? 請自行重載 帶有 optional 標致的函數
童鞋們提到的 密碼修改后 要失效的問題 當時沒有想到 個人認為 大致方向可以》
》1. 每個用戶生成1個xml 里面保存隨機的幾個字符 或者修改密碼的時間戳也行
》2.這個文件在用戶剛注冊 或修改密碼時候生成寫入; 寫入的同時需要更新當前用戶的cookie 否則當前用戶也會失效
》3. 在本實例的基礎上 加1個字段 內容為 1中的若干字符 本實例在cookie寫入15分鐘后才會重新寫入新的cookie;可以在重新寫入cookie前 比對這幾個若干字符是否匹配 用 StreamReader 即可
》4. 以上不知 大家看懂了沒有呢
以下類實現了 使用加密cookie代替session驗證用戶登錄狀態 支持 1小時/1周 有效期2種模式 (期間有新的請求則更新失效時間)
項目源碼下載地址http://www.370b.com/bbsx/cookie-login/cookie.rar
csdn下載地址http://download.csdn.net/detail/rayyu1989/4265766
在自定義字符 CustomCode 不被知道的情況下 該加密過程是相對安全的.你還可以更改其中 的 2處md5哈希值 生成的方式、DEChar(ENChar)混淆字符 讓代碼更與眾不同
歡迎大家拍磚
加密后的cookie值枚舉:
n=rayyu_EJPSiju2JJNeh5&u=VWpc9dv5v8e4APbbhJmSP+yifwZNEcyRy6V/RwzqV2pmo+x6hNLHI/pLlzl8+KgdWpMHtTTOYpGMe3tCrAIKkmeCrKG7BpSVUYF0piopz757NPb43Z4ehA==&i=56-76-68-35-4A-37-57-35
n=rayyu_P5O7ouiq5JVaMf&u=gWz/itCIlbupWCv7iziBuYCwT1SF4+IbyFbwa5Hmm+up4iuCxKMCl24+bLRb0Y/6RMyfzcpuJwu8gT/Yqg1UV1bd9UqgQYzrLdibP9zaXkYjYyT56gkCBg==&i=5B-65-54-34-6G-35-4C-45
n=rayyu_bNJuGxps3Kqtxl&u=kUorl6z713eYdjkhRidocZKHMh2Mw6j5LowmevsWiKZsn81dzlsPcH4fp1VJsi2dtObeYvMJTCybLrv45TsdLIT7nhZcQJdxKGn1oaK/7a3Ldfte6zoQQg==&i=4H-5B-53-6A-6H-75-32-4H
n=rayyu_TF0hpOgdGhliK8&u=1O9Zi4V9Qj2HH63dEfXaLaoj3X6ea9azIBjuLjFBJqhiTQefz2x161IIDpWaviJr1TTECBdb4NCIiFOEsEY9C4gl+/Equjc7tGpO12ixEkZz70bMg48M9w==&i=4H-4E-65-68-35-7A-5B-35
n=rayyu_9INryZvNo1pCKm&u=wQgRgtf+uy9jKQXJhr7DerZtFeYmm2Lx10Asgf52HTzkar9iHXkVaJJqHtwWA9K635QU4bGLYZPWl3nj0rxOhOe93ew+bIAR8FWr2zPwvfZ++TwB3670LQ==&i=4F-37-6F-75-6A-71-35-4H
客戶端可以獲取cookie的 n值 來簡單判斷是否登錄 n為用戶名,配合靜態頁和緩存 動態顯示登錄狀態
VB.NET調用: (Rayyu 是 namespace)
[vb]view plaincopy- DimuserAsNewRayyu.User()'初始化用戶信息(檢測當前請求用戶是否登錄)
- Ifuser.OnlineThen
- Response.Write("<br/>name:"&user.Name&",online:"&user.Online&",id:"&user.ID)
- EndIf
- Dimuser2AsNewRayyu.User(1,"用戶名",False)'初始化(寫入新用戶)
C#調用:(Rayyu 是 namespace)
[csharp]view plaincopy- Rayyu.Useruser=newRayyu.User();//初始化用戶信息(檢測當前請求用戶是否登錄)
- Rayyu.Useruser2=newRayyu.User(1,"用戶名",false);//初始化(寫入新用戶)false表示1小時true表示1周
- if(user.Online)
- {
- Response.Write("<br/>name:"+user.Name+",online:"+user.Online+",id:"+user.Id);
- }
VB.NET 源代碼:
[vb]view plaincopy- ImportsSystem.Web
- ImportsSystem.Text.RegularExPRessions
- ImportsSystem.Text
- ImportsSystem.Security.Cryptography
- '''<summary>
- '''用戶登錄機制支持1小時/1周狀態
- '''</summary>
- '''<remarks></remarks>
- PublicClassUser
- #Region"自定義參數"
- '''<summary>
- '''自定義字符用于第一層加解密密匙
- '''</summary>
- '''<remarks></remarks>
- PrivateConstCustomCodeAsString="QQ:867863456"
- '''<summary>
- '''cookie名
- '''</summary>
- '''<remarks></remarks>
- PrivateConstCookieNameAsString="userinfo"
- '''<summary>
- '''Cookie作用域
- '''</summary>
- '''<remarks></remarks>
- PrivateConstCookieDomainAsString=".370b.com"
- '''<summary>
- '''編碼
- '''</summary>
- '''<remarks></remarks>
- PrivateSharedEncoderAsEncoding=Encoding.UTF8
- '''<summary>
- '''用戶名的正則檢測我的是:首位由字母或者漢字構成,由字母、數字、下劃線、和漢字的2-20位的字符組合而成的
- '''</summary>
- '''<remarks></remarks>
- PrivateConstRegexUserNameAsString="[a-zA-Z/u4e00-/u9fa5][/w/u4e00-/u9fa5]{1,19}"
- '''<summary>
- '''區域化信息設置
- '''</summary>
- '''<remarks></remarks>
- PrivateSharedReadOnlyFormatAsGlobalization.CultureInfo=NewSystem.Globalization.CultureInfo("zh-CN",True)
- #EndRegion
- #Region"回調參數"
- '''<summary>
- '''是否在線
- '''</summary>
- '''<remarks></remarks>
- PublicReadOnlyPropertyOnlineAsBoolean
- Get
- Return_Online
- EndGet
- EndProperty
- Private_OnlineAsBoolean=False
- '''<summary>
- '''用戶ID(Online=true情況下使用)
- '''</summary>
- '''<remarks></remarks>
- PublicReadOnlyPropertyIdAsInteger
- Get
- Return_Id
- EndGet
- EndProperty
- Private_IdAsInteger
- '''<summary>
- '''用戶名(Online=true情況下使用)
- '''</summary>
- '''<remarks></remarks>
- PublicReadOnlyPropertyNameAsString
- Get
- Return_Name
- EndGet
- EndProperty
- Private_NameAsString
- '''<summary>
- '''有效期是否為7天
- '''</summary>
- '''<remarks></remarks>
- PublicReadOnlyPropertyIsWeekAsBoolean
- Get
- Return_IsWeek
- EndGet
- EndProperty
- PrivateReadOnly_IsWeekAsBoolean
- #EndRegion
- '''<summary>
- '''初始化用戶信息(檢測當前請求用戶是否登錄)