gpt4 book ai didi

c# - 登录 session 未使用 WebRequest/Response 转移到新网页?

转载 作者:太空狗 更新时间:2023-10-29 21:23:59 24 4
gpt4 key购买 nike

好吧,我已经在这个独奏上绞尽脑汁太久了。即使在这个网站和许多其他网站上花费了数小时,我也无法破解它。

本质上,我正在尝试使用 WebRequest/Response 从登录页面后面的网页中剥离一些数据。 (我已经使用带有一些分层事件的 WebBrowser 控件来实现这个功能,这些事件可以导航到不同的网页,但是在尝试重构时它会导致一些问题 - 更不用说使用隐藏表单来完成工作了是“不好的做法”。)

这是我的:

        string formParams = string.Format("j_username={0}&j_password={1}", userName, userPass);
string cookieHeader;

WebRequest request = WebRequest.Create(_signInPage);
request.ContentType = "text/plain";
request.Method = "POST";
byte[] bytes = Encoding.ASCII.GetBytes(formParams);
request.ContentLength = bytes.Length;
using (Stream os = request.GetRequestStream())
{
os.Write(bytes, 0, bytes.Length);
}
WebResponse response = request.GetResponse();
cookieHeader = response.Headers["Set-Cookie"];

WebRequest getRequest = WebRequest.Create(sessionHistoryPage);
getRequest.Method = "GET";
getRequest.Headers.Add("Cookie", cookieHeader);
WebResponse getResponse = getRequest.GetResponse();
try
{
using (StreamReader sr = new StreamReader(getResponse.GetResponseStream()))
{
textBox1.AppendText(sr.ReadToEnd());
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
throw;
}

到目前为止,我能够从第一个链接转到正确的页面,但是当我转到第二个链接时,它会将我送回登录页面,就好像我没有登录一样。

问题可能在于 cookie 没有被正确捕获,但我是新手,所以也许我只是做错了。它捕获从 POST 发回的 cookie:JSESSIONID 和 S2V 然而,当我们使用 FireFox WebConsole 转到“GET”时,浏览器显示它发送了 JSESSIONID、S2V SPRING_SECURITY_REMEMBER_ME_COOKIE,我believe 是当我点击登录表单上的“记住我”框时使用的 cookie。

我已经尝试了很多不同的方法来使用 SO 的资源来完成这项工作,但我还没有到达我需要的页面。所以,为了我剩下的头发,我决定在好的 ole SO 上寻求帮助。 (这是我不想放弃的事情之一 - 有时像那样固执)

如果有人想要我尝试登录的网站的实际地址,我非常乐意通过私信将其发送给几个人。

我必须反射(reflect) Wal 建议答案的代码:

var request = (HttpWebRequest)WebRequest.Create(sessionHistoryPage);
request.Credentials = new NetworkCredential(userName, userPass);
request.CookieContainer = new CookieContainer();
request.PreAuthenticate = true;


WebResponse getResponse = request.GetResponse();
try
{
using (StreamReader sr = new StreamReader(getResponse.GetResponseStream()))
{
textBox1.AppendText(sr.ReadToEnd());
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
throw;
}

这个建议,至少我实现它的方式,没有奏效。

正如 Krizz 所建议的,我更改了代码以使用 CookieContainer 并将 cookie 从一个请求传输到另一个请求,但是,响应只是返回原始登录页面,就好像我没有登录一样。

是否有某些网站不允许此类行为?

最终解决方案

最终的解决方案是由 Adrian Iftode 提出的,他说我尝试登录的网站可能不允许在没有有效 session 的情况下进行身份验证,因此在这个过程让我得到了那个 cookie。

感谢大家的帮助!

最佳答案

我正在为一个用 PHP 编写的网站做某种 cookie 传输。很明显你传递的是 cookie,但在那种情况下可能是这样

var phpsessid = response.Headers["Set-Cookie"].Replace("; path=/", String.Empty);

Set-Cookie header 包含有关 cookie 的其他相关信息以及其他 cookie 的可能其他说明。我有一个带有信息(路径)的 cookie,我需要将其发送回服务器的 session ID,以便服务器知道我是发出 GET 请求的同一客户端。

新请求必须包含这个 cookie

request.Headers["Cookie"] = phpsessid;

您已经这样做了,但请确保您收到的 cookie 已发送回服务器。

考虑到 session 和身份验证,有两种 cookie,一种用于 session ,一种用于身份验证,一些服务器/应用程序可能不允许在没有有效 session 的情况下进行身份验证。我想说的是,您可能还需要传递 session cookie。所以步骤是:

  • 首先执行 GET 请求以获取 session cookie。
  • 接下来执行 POST 请求以进行身份​​验证并获取身份验证 cookie。
  • 使用这两个 cookie 导航到 protected 页面。

同时检查 this question ,它没有显示整个类,但想法是将 CookieContainer 保持在同一个类中,从 POST/GET 请求中添加新的 cookie,并将它们分配给每个新请求,就像@Krizz 回答的那样。

关于c# - 登录 session 未使用 WebRequest/Response 转移到新网页?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9461960/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com