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

C# HttpWebRequest 模擬登入小米:Cookie 域名不匹配導致關鍵 Cookie 未發送

     編輯:程式設計綜合問答

問題核心

登入成功後 CookieContainer 擁有三個域:.xiaomi.com、account.xiaomi.com、.account.xiaomi.com。關鍵 pwdToken、passToken 在 .account.xiaomi.com 下,但後續 GET 請求僅發送 account.xiaomi.com 的 Cookie,導致未登入態。

根本原因

CookieContainer 依據 域名尾碼匹配規則 自動篩選 Cookie。請求 https://account.xiaomi.com/... 時:

  • .account.xiaomi.com 為「點開頭」域,匹配 account.xiaomi.com 及其子域。
  • 但 account.xiaomi.com(無點)優先級更高,導致容器僅取該域下的 Cookie,忽略 .account.xiaomi.com。

解決方案

  1. 手動合併 Cookie:登入響應後,遍歷 CookieContainer,將 .account.xiaomi.com 下的 Cookie 手動加入 account.xiaomi.com 域。
    foreach (Cookie c in m_Cookie.GetCookies(new Uri("https://.account.xiaomi.com"))) {
        m_Cookie.Add(new Uri("https://account.xiaomi.com"), c);
    }
  2. 統一域名:登入請求改用 https://account.xiaomi.com/...(無 www),確保 Set-Cookie 域一致。
  3. 改用 HttpClient:System.Net.Http.HttpClient 配合 CookieContainer 處理更符合 RFC 6265,較少此類坑。

代碼修正要點

// 登入後
var loginUri = new Uri("https://account.xiaomi.com/pass/serviceLoginAuth2");
var cookies = m_Cookie.GetCookies(loginUri);
foreach (Cookie c in cookies) {
    // 強制同步到無點域
    if (c.Domain.StartsWith(".")) {
        var fixedDomain = c.Domain.TrimStart('.');
        m_Cookie.Add(new Uri("https://" + fixedDomain), c);
    }
}
// 後續請求直接用 m_Cookie

避坑提醒

  • 勿在每次請求 new CookieContainer(),需全程共用同一實例。
  • Fiddler 抓包對比瀏覽器與程式的 Cookie 差異,快速定位域名問題。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved