Asp.Net使用加密cookie代替session验证用户登录状态 源码分享

8/10/2015来源:ASP.NET技巧人气:6162

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
  1. DimuserAsNewRayyu.User()'初始化用户信息(检测当前请求用户是否登录)
  2. Ifuser.OnlineThen
  3. Response.Write("<br/>name:"&user.Name&",online:"&user.Online&",id:"&user.ID)
  4. EndIf
  5. Dimuser2AsNewRayyu.User(1,"用户名",False)'初始化(写入新用户)

C#调用:(Rayyu 是 namespace)

[csharp]view plaincopy
  1. Rayyu.Useruser=newRayyu.User();//初始化用户信息(检测当前请求用户是否登录)
  2. Rayyu.Useruser2=newRayyu.User(1,"用户名",false);//初始化(写入新用户)false表示1小时true表示1周
  3. if(user.Online)
  4. {
  5. Response.Write("<br/>name:"+user.Name+",online:"+user.Online+",id:"+user.Id);
  6. }

VB.NET 源代码:

[vb]view plaincopy
  1. ImportsSystem.Web
  2. ImportsSystem.Text.RegularExPRessions
  3. ImportsSystem.Text
  4. ImportsSystem.Security.Cryptography
  5. '''<summary>
  6. '''用户登录机制支持1小时/1周状态
  7. '''</summary>
  8. '''<remarks></remarks>
  9. PublicClassUser
  10. #Region"自定义参数"
  11. '''<summary>
  12. '''自定义字符用于第一层加解密密匙
  13. '''</summary>
  14. '''<remarks></remarks>
  15. PrivateConstCustomCodeAsString="QQ:867863456"
  16. '''<summary>
  17. '''cookie名
  18. '''</summary>
  19. '''<remarks></remarks>
  20. PrivateConstCookieNameAsString="userinfo"
  21. '''<summary>
  22. '''Cookie作用域
  23. '''</summary>
  24. '''<remarks></remarks>
  25. PrivateConstCookieDomainAsString=".370b.com"
  26. '''<summary>
  27. '''编码
  28. '''</summary>
  29. '''<remarks></remarks>
  30. PrivateSharedEncoderAsEncoding=Encoding.UTF8
  31. '''<summary>
  32. '''用户名的正则检测我的是:首位由字母或者汉字构成,由字母、数字、下划线、和汉字的2-20位的字符组合而成的
  33. '''</summary>
  34. '''<remarks></remarks>
  35. PrivateConstRegexUserNameAsString="[a-zA-Z\u4e00-\u9fa5][\w\u4e00-\u9fa5]{1,19}"
  36. '''<summary>
  37. '''区域化信息设置
  38. '''</summary>
  39. '''<remarks></remarks>
  40. PrivateSharedReadOnlyFormatAsGlobalization.CultureInfo=NewSystem.Globalization.CultureInfo("zh-CN",True)
  41. #EndRegion
  42. #Region"回调参数"
  43. '''<summary>
  44. '''是否在线
  45. '''</summary>
  46. '''<remarks></remarks>
  47. PublicReadOnlyPropertyOnlineAsBoolean
  48. Get
  49. Return_Online
  50. EndGet
  51. EndProperty
  52. Private_OnlineAsBoolean=False
  53. '''<summary>
  54. '''用户ID(Online=true情况下使用)
  55. '''</summary>
  56. '''<remarks></remarks>
  57. PublicReadOnlyPropertyIdAsInteger
  58. Get
  59. Return_Id
  60. EndGet
  61. EndProperty
  62. Private_IdAsInteger
  63. '''<summary>
  64. '''用户名(Online=true情况下使用)
  65. '''</summary>
  66. '''<remarks></remarks>
  67. PublicReadOnlyPropertyNameAsString
  68. Get
  69. Return_Name
  70. EndGet
  71. EndProperty
  72. Private_NameAsString
  73. '''<summary>
  74. '''有效期是否为7天
  75. '''</summary>
  76. '''<remarks></remarks>
  77. PublicReadOnlyPropertyIsWeekAsBoolean
  78. Get
  79. Return_IsWeek
  80. EndGet
  81. EndProperty
  82. PrivateReadOnly_IsWeekAsBoolean
  83. #EndRegion
  84. '''<summary>
  85. '''初始化用户信息(检测当前请求用户是否登录)