我正在编写一个应用程序,需要打开浏览器窗口(可能会坚持使用IE)到使用表单身份验证的网站。诀窍是他们需要进行身份验证,以便节省时间,因为我们需要进入的网站数量庞大。 (最终我将屏幕抓取它们并处理数据......但我仍然需要让认证工作正常工作,以便他们可以在需要时点击进入真实网站。)
我已经使用了Forms Authentication部分,因为我可以使用HttpWebRequest获取html并将其传递给浏览器。但是我无法将cookie转移到客户端浏览器,以便它可以转到实际的网站。
我正在获取用于身份验证的System.Net.Cookies,我已经尝试将它们复制到System.Web.HttpCookies并将它们添加到Response对象中。如果我在页面上放置一个链接或使用Response.Redirect转到它不起作用的网站,则表明用户未经过身份验证。
任何人都知道如何解决这个问题?
以下是当前代码,以便更清楚:
Dictionary<string, string> formValues = new Dictionary<string, string>(4);
formValues.Add("txbUserName", "USERNAME");
formValues.Add("txbPassword", "PASSWORD");
formValues.Add("SubmitB", "Log In");
HttpWebRequest webRequest;
StreamReader responseReader;
string responseData;
//This authenticates an HttpWebRequest and returns it
webRequest = FormsAuthHttpWebRequest.Create("REQUESTURI", "LOGINURI",
formValues) as HttpWebRequest;
responseReader = new StreamReader(webRequest.GetResponse().GetResponseStream());
responseData = responseReader.ReadToEnd();
responseReader.Close();
foreach (Cookie cookie in webRequest.CookieContainer.GetCookies(new Uri("SITEURI")))
{
HttpCookie httpCookie = new HttpCookie(cookie.Name, cookie.Value)
{
Domain = cookie.Domain,
Expires = cookie.Expires,
Path = cookie.Path,
HttpOnly = cookie.HttpOnly,
Secure = cookie.Secure
};
Response.Cookies.Add(httpCookie);
}
Response.Redirect("REQUESTURI");
答案 0 :(得分:3)
我认为你无法做到这一点。浏览器将忽略来自不属于与cookie关联的域的Web服务器的任何“Add-Cookie”标头。这是cookie的内置安全性的一部分 - 如果其他网站可以读取或写入另一个域的cookie,那将是灾难性的(从安全和隐私的角度来看)。
答案 1 :(得分:0)
我认为由于即将发生的Response.Redirect,浏览器可能会忽略响应头中的cookie。我们最近遇到了这个问题,并发现FF接受了cookie,但IE6和7没有接受。
但是,我不确定我到底知道你要做什么。您是否尝试将Cookie从站点A发送到实际用于站点B的浏览器?