将Cookie从CookieContainer写入IE Cookie存储区

时间:2010-09-08 13:51:45

标签: c# .net internet-explorer httpwebresponse cookiecontainer

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

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

我有一些工作代码构建HTTP POST,将其发送出去,并获得包含正确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 个答案:

答案 0 :(得分:3)

您需要调用非托管InternetSetCookie()函数。看!有人wrote the interop已经为你了。你应该验证它的正确性。