首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C# 實現「記住密碼 / 自動登錄」:基於 Cookie 的安全存儲與驗證流程

     編輯:程式設計疑難解答

核心機制

現代「記住密碼」與「自動登錄」均基於 **HTTP Cookie**(或 Token)實現,核心流程:

  1. 用戶勾選「記住密碼」並登錄成功;
  2. 服務端生成**加密 Ticket**(含 UserId、過期時間、隨機 Salt),設置 HttpOnly; Secure; SameSite=Strict Cookie;
  3. 瀏覽器自動攜帶 Cookie 訪問,服務端驗證 Ticket 有效性並自動完成身份認證;
  4. 登出 / 密碼修改 / 異地登錄時,服務端撤銷對應 Ticket,客戶端同步清除 Cookie。

關鍵安全措施

  • 絕不存明文密碼:Cookie 僅存**加密 Token**,而非密碼;
  • 加密算法:AES-GCM / ChaCha20-Poly1305,附帶時間戳與隨機 Nonce,防重放;
  • HttpOnly + Secure:防 XSS 竊取、強制 HTTPS 傳輸;
  • SameSite=Strict/Lax:防 CSRF;
  • 短過期 + 刷新機制:Access Token 15-30 分鐘,Refresh Token 7-30 天,分離風險。

C# 實現骨架

// 登錄成功後
var ticket = new AuthenticationTicket(
    new ClaimsPrincipal(identity),
    new AuthenticationProperties {
        IsPersistent = rememberMe,      // 記住我
        ExpiresUtc = DateTimeOffset.UtcNow.AddDays(30)
    });
var cookieValue = TicketSerializer.Serialize(ticket); // 機密加密
Response.Cookies.Append("AuthCookie", cookieValue, new CookieOptions {
    HttpOnly = true,
    Secure = true,
    SameSite = SameSiteMode.Strict,
    Expires = rememberMe ? DateTimeOffset.UtcNow.AddDays(30) : null
});

// 後續請求自動由 CookieAuthenticationMiddleware 解析驗證

ASP.NET Core 內置 CookieAuthentication 已完整實現上述流程,**勿自行造輪子**。

QQ 等早期客戶端的本地存儲

早期桌面端 QQ 將加密後的密碼存於註冊表 / %APPDATA% 文件,現已全面遷移至 **Token + 設備指紋** 模式,本地不再持久化任何密碼等價物。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved