分層架構下,需用 HttpWebRequest 抓取同域下 .do 動態頁面資料。AJAX 請求同樣是 .do 卻能通過驗證,HttpWebRequest 卻失敗。禁用 Cookie 後 Membership 仍生效,排除 Cookie 傳遞方案。

發現請求頭含 .User 節點,推測為 Membership 識別標記。
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(requestUrl);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded;charset=UTF-8;";
request.Headers.Add(string.Format("Cookie:.User={0}",
FormsAuthentication.GetAuthCookie(HttpContext.Current.User.Identity.Name, false).Value));
using (Stream stream = request.GetRequestStream())
using (StreamWriter sw = new StreamWriter(stream))
sw.Write(param);
string json;
using (Stream stream = request.GetResponse().GetResponseStream())
using (StreamReader sr = new StreamReader(stream, Encoding.UTF8))
json = sr.ReadToEnd();
測試通過。原理:AJAX 從 ASPX 頁面發出,屬 ASP.NET 管線自動攜帶驗證票據;HttpWebRequest 直接請求 .do 處理程式,繞過管線,需手動補上驗證票據。
針對任何 Membership 站點,先用瀏覽器登入,用 Fiddler 擷取 .User 值,加入程式請求頭即可繞過驗證抓取內容。