Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 登录会话未使用WebRequest/Response传输到新网页?_C#_.net_Forms Authentication_Webrequest - Fatal编程技术网

C# 登录会话未使用WebRequest/Response传输到新网页?

C# 登录会话未使用WebRequest/Response传输到新网页?,c#,.net,forms-authentication,webrequest,C#,.net,Forms Authentication,Webrequest,好吧,我已经为这个单飞绞尽脑汁很久了。即使在这个网站和其他很多网站上花了几个小时,我也无法破解它 本质上,我试图使用WebRequest/Response从登录页面后面的网页中删除一些数据。(我使用WebBrowser控件实现了这一点,该控件带有一些分层事件,可以导航到不同的网页,但在尝试重构时会导致一些问题——更不用说有人说使用隐藏表单来完成这项工作是“糟糕的做法”。) 这就是我所拥有的: string formParams = string.Format("j_usernam

好吧,我已经为这个单飞绞尽脑汁很久了。即使在这个网站和其他很多网站上花了几个小时,我也无法破解它

本质上,我试图使用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;
        }
到目前为止,我能够从第一个链接进入正确的页面,但当我进入第二个链接时,它会将我发送回登录页面,就好像我没有登录一样

问题可能在于cookies没有被正确捕获,但我是个新手,所以可能我只是做错了。它捕获从POST:JSESSIONID和S2V返回的COOKIE。然而,当我们使用FireFox WebConsole进入“GET”时,浏览器显示它发送了JSESSIONID、S2V和SPRING_SECURITY_membere_ME_COOKIE,我相信这就是我在登录表单上单击“记住我”框时使用的COOKIE

我使用SO的资源尝试了许多不同的方法,但是我还没有到达我需要的页面。所以,为了我留下的头发,我决定向你寻求帮助。(这是我不想放弃的事情之一——有时像那样固执)

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

我必须反映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提出的,他说我尝试登录的网站可能不允许在没有有效会话的情况下进行身份验证,因此在流程开始时添加GET允许我获取该cookie


谢谢你们的帮助,伙计们

尝试使用
CookieContainer
,该类用于在多个请求之间保持Cookie上下文。您只需创建一个实例并将其分配给每个
WebRequest

因此,修改您的代码:

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

var cookies = new CookieContainer(); // added this line

var request = WebRequest.Create(_signInPage) as HttpWebRequest; // modified line
request.CookieContainer = cookies; // added this line
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);
}

request.GetResponse(); // removed some code here, no need to read response manually

var getRequest = WebRequest.Create(sessionHistoryPage) as HttpWebRequest; //modified line
getRequest.CookieContainer = cookies; // added this line
getRequest.Method = "GET";
WebResponse getResponse = getRequest.GetResponse();
try
{
   using (StreamReader sr = new StreamReader(getResponse.GetResponseStream()))
   {
      textBox1.AppendText(sr.ReadToEnd());
   }
}
catch (Exception ex)
{
   MessageBox.Show(ex.Message);
   throw;
}

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

var phpsessid = response.Headers["Set-Cookie"].Replace("; path=/", String.Empty);
Set Cookie
标题包含有关Cookie的其他相关信息以及其他Cookie可能的其他说明。我有一个带有信息(路径)的cookie,会话id需要发送回服务器,以便服务器知道我是执行GET请求的同一个客户端

新请求必须包含此cookie

request.Headers["Cookie"] = phpsessid;
您已经这样做了,但请确保您收到的cookie已发送回服务器

考虑到会话和身份验证,有两个cookie,一个用于会话,一个用于身份验证,一些服务器/应用程序可能不允许在没有有效会话的情况下进行身份验证。我想说的是,您可能也需要通过会话cookie。因此,步骤如下:

  • 首先执行GET请求以获取会话cookie
  • 接下来执行POST请求以进行身份验证并获取身份验证cookie
  • 使用这两个cookie导航到受保护的页面

还要检查一下,它不会显示整个类,但我们的想法是将CookieContainer保持在同一个类中,添加POST/GET请求中的新cookie,并将它们分配给每个新请求,如@Krizz answered。

实用建议GET Fiddler,查看登录后浏览器发送和接收的标题。然后在你的c#代码中模仿它们。@zespri我以前用过Fiddler,老实说,以我目前的编程能力,这是我无法想象的。这是我正在研究的东西,但没有多大帮助,我从FireFox web控制台获得了相同的信息。我假设我需要更改为HttpWebResponse/Request,因为WebResponse没有CookieContainer?这是一个银弹。经过一些额外的测试,我发现将第一个GET添加到代码中是一个技巧。我甚至不需要从cookies中删除“path=/”。谢谢你,我一定会在18小时后给你奖金(网站不会让我马上这么做)。