httpwebrequest 模拟登录windows live 跳转其他域的问题(如HOTMAIL ,MSN,XBOX LIVE)
 我的做法是传统的模拟登录,分析出需要的参数进行登录。当然不通过任何WINDOWS live API 。
通过分析 我可以正常登录 windows live 已XBOX360的登录地址为例
ttps://login.live.com/ppsecure/post.srf?wa=wsignin1.0&rpsnv=11&ct=1309398007&rver=6.0.5286.0&wp=MBI&wreply=https:%2F%2Flive.xbox.com:443%2Fxweb%2Flive%2Fpassport%2FsetCookies.ashx%3Frru%3Dhttps%253a%252f%252flive.xbox.com%252fen-US%252fAccount%252fSignin%253freturnUrl%253dhttp%25253a%25252f%25252fwww.xbox.com%25252fzh-HK%25252f&lc=1033&id=66262&cbcxt=0-aHR0cHM6Ly9saXZlLnhib3guY29tL2VuLVVTL0FjY291bnQvU2lnbmluP3JldHVyblVybD1odHRwJTNhJTJmJTJmd3d3Lnhib3guY29tJTJmemgtSEslMmY1&bk=1309398039
登录时有用的参数只有
string postdata = "login=xxxx@xcom&passwd=xxxxx&type=11&LoginOptions=2&NewUser=1&MEST=&PPSX=Pa&PPFT=XXXXXXXX&idsbho=1&PwdPad=&sso=&i1=&i2=1&i3=32922&i4=&i12=";
只有红色的是有用的 其中ppft是随机生产,需要提取出来 当访问上面提供的地址就可以通过查看源码的形式找到
登录成功后会给你 上面登录地址后面的地址进行跳转从而到到指定不同的域下
https:%2F%2Flive.xbox.com:443%2Fxweb%2Flive%2Fpassport%2FsetCookies.ashx%3Frru%3Dhttps%253a%252f%252flive.xbox.com%252fen-US%252fAccount%252fSignin%253freturnUrl%253dhttp%25253a%25252f%25252fwww.xboxcom%25252fzh-HK%25252f&lc=1033&id=66262&cbcxt=0-  注意看上面给的地址就是这个
这个是第一次POST请求 跳转成功后  浏览器会自动进行POST HTTPWEBREQUEST无法使用JS所以只能通过模拟实现
第一次POST请求 返回的数据包入下
<html><head><noscript>JavaScript required to sign in<meta http-equiv="Refresh" content="0; URL=https://login.live.com/jsDisabled.srf?mkt=EN-US&lc=1033"/></noscript><title>Continue</title><script type="text/javascript">function OnBack(){}function DoSubmit(){var subt=false;if(!subt){subt=true;document.fmHF.submit();}}</script></head><body onload="javascript:DoSubmit();"><form name="fmHF" id="fmHF" action="https://live.xbox.com:443/xweb/live/passport/setCookies.ashx?rru=https%3a%2f%2flive.xbox.com%2fen-US%2fAccount%2fSignin%3freturnUrl%3dhttp%253a%252f%252fwww.xbox.com%252fen-US&wa=wsignin1.0" method="post" target="_top"><input type="hidden" name="NAPExp" id="NAPExp" value="Tue, 11-Oct-2011 00:12:35 GMT"><input type="hidden" name="NAP" id="NAP" value="V%3D1.9%26E%3Db0d%26C%3DmX6MI45AQ6zplznVfEquDGYWjYq7xnPIHGb78272DK_wr-cNxYmz1Q%26W%3D1"><input type="hidden" name="ANON" id="ANON" value="A%3DEC88A20961611B9D51FAC6AEFFFFFFFF%26E%3Db67%26W%3D1"><input type="hidden" name="ANONExp" id="ANONExp" value="Thu, 19-Jan-2012 01:12:35 GMT"><input type="hidden" name="t" id="t" value="EgAoAQMAAAAEgAAACoAAaS8p8cMvBLcJgCe5iIcwYvXm0WXSDl/RKIrBs02TtRYn9snRfmOExqNKjxvxFXwSs6KhBt6CF0j3A/OAPG8UFmYmHADhI3AJW/pV53GIIlzMNaMJEmh4UpUbk/LmtRNc7pbiyu1yjpu+0YGh7cqfdatZDGYh0SOpK6W2diXIf1aXAFkAlwAAAAYA3QOPx0MZD05DGQ9O1gIBAAARAAAAAAAqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAq0JAUbZnROMAAEMZD06DxiFOAAAAAAAAAAAAAAAADwAxMTIuMjM3LjIwNi43OAAAAAAAAAAAAAAAAAAAAQAAAQAAAQAAAQAAAAA="></form></body></html>
 此数据包会有个表单 这个表单就是第2次POST请求的数据 所有数据为动态,需要提取出来!
因为 浏览器会自动跳转,但是HTTPWEBREQUEST无法实现JS的调用 ,所以要模拟第2次
起初的时候我怎么模拟都不行提交不上去 COOKIE无缘无故的丢失。后来才发现是跨域了 这个原因为找了3天 很悲剧的说!
问题找到了,折腾了半天也不知道怎么解决起初我想 是不是  cookieContainer 本身的问题 于是我进行修改 下面是代码片段
也就是每次请求后我都把COOKIE保存下来
  httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(url);//发送请求
                httpWebRequest.CookieContainer = cookieContainer;//填充COOKIE
                if (cookieCollections.Count> 0)
                 {
         
                    string cookiesValue = "";
                foreach (Cookie o in cookieCollections)
                   {
                    cookiesValue += o.Name+"="+ o.Value+",";
                    }
                  httpWebRequest.CookieContainer.SetCookies(new Uri(url),cookiesValue);
但是无法正常登录  应该是跨域问题
结果还是不行  找了一些资料上面说修改domain 但是不明白是什么意思,
但是就是不明白希望您可以帮忙看看。如果能简单些一下DEMO就更好了
谢谢
       

解决方案 »

  1.   

    你可以从 Response.Header["SetCookie"] 取到字符串,然后把domain和path都去掉后,再直接用
    Request.Headers.Add("Cookie", 字符串) 这样。
      

  2.   

    我也碰到你的类似的问题,这个虽然不能说是 httpwebrequest的bug,但是确实给造成了很多困扰。
    问题出在 abc.com, .abc.com 的 cookie 的domain设置上。对于 httpwebrequest来说,如果你要请求的是http://abc.com/xxxx, 那么以.abc.com的为domain的cookie,是不能通过 httpwebrequest 来发送的,.abc.com的cookie被过滤掉了。要解决也很简单,把 .abc.com 为 domain的cookie重组一下,去掉 . 就行了,这样所有的cookie的domain都会是 abc.com,cookie自然也就传递出去了