代码之家  ›  专栏  ›  技术社区  ›  Christian Hayter

将cookie从cookiecontainer写入IE cookie存储

  •  3
  • Christian Hayter  · 技术社区  · 14 年前

    我想从桌面应用程序导航到Web应用程序中的页面。”没问题”,我听到你说,“只要用正确的URL启动默认浏览器就行了”。但是,Web应用程序使用ASP.NET窗体身份验证,用户不希望看到登录页,因为他们已经使用桌面应用程序中的相同凭据进行了身份验证。

    这听起来很简单,我所要做的就是从桌面应用程序发出一个HTTP帖子,这个帖子会伪造Web应用程序登录页面上的帖子。然后,Web应用程序将设置其身份验证票证和会话状态cookie,并将它们返回给我,我将它们存储在IE cookie存储区中。然后我可以导航到所需的页面,Web应用程序会认为它已经过身份验证。

    我有一些工作代码来构造HTTP日志,发送它,并得到包含正确cookie的有效响应。但是,我不知道如何将它们写入IE cookie商店。有人能给我指出正确的方向吗?

    样例代码:

    var requestUrl = Properties.Settings.Default.WebsiteLoginPageUrl;
    
    var requestEncoding = Encoding.GetEncoding(1252);
    
    // Simulated login postdata
    var requestText = string.Format(
        "__VIEWSTATE={2}&__EVENTTARGET={3}&__EVENTARGUMENT={4}&__EVENTVALIDATION={5}&userNameText={0}&passwordText={1}&submitButton=Log+In",
        HttpUtility.UrlEncode(Properties.Settings.Default.UserName),
        HttpUtility.UrlEncode(Properties.Settings.Default.Password),
        Properties.Settings.Default.FakeViewState,
        Properties.Settings.Default.FakeEventTarget,
        Properties.Settings.Default.FakeEventArgument,
        Properties.Settings.Default.FakeEventValidation);
    
    var request = (HttpWebRequest) WebRequest.Create(requestUrl);
    request.Method = "POST";
    request.Accept = "*/*";
    request.ContentType = "application/x-www-form-urlencoded";
    request.ContentLength = requestEncoding.GetByteCount(requestText);
    request.Headers.Add(HttpRequestHeader.CacheControl, "no-cache");
    request.AllowAutoRedirect = false;
    request.KeepAlive = false;
    request.CookieContainer = new CookieContainer();
    
    using(var writer = new StreamWriter(request.GetRequestStream(), requestEncoding)) {
        writer.Write(requestText);
    }
    
    var response = (HttpWebResponse) request.GetResponse();
    
    // TODO: Grab the response cookies and save them to the interactive desktop user's cookie store.
    
    Process.Start(new ProcessStartInfo {
        FileName = Properties.Settings.Default.WebsiteTargetPageUrl,
        UseShellExecute = true,
    });
    
    1 回复  |  直到 14 年前
        1
  •  3
  •   i_am_jorf    14 年前

    你需要调用非托管 InternetSetCookie() 功能。看!某人 wrote the interop 已经为你准备好了。不过,您应该验证它的正确性。

    推荐文章