C# 使用c登录到需要Cookies的网站#

C# 使用c登录到需要Cookies的网站#,c#,webrequest,login-script,C#,Webrequest,Login Script,我正试图用c语言编写一个脚本,能够从网站上检索一些信息。这些信息是受保护的,所以我需要先登录才能阅读它们。我认为这就是我的程序: 首先,使用POST请求登录网站。这里是我的第一个问题:我找到登录表单的页面是这样的。我应该向该页面提交POST请求还是使用其他地址 我已经使用Firefox或Chrome的一些工具测试了标题,但我不知道哪个是正确的过程。我注意到,如果我打开这个登录页面,我会收到一些cookies。如果我删除这些cookie并尝试通过插入用户和密码(通过浏览器)登录,我会收到一个错

我正试图用c语言编写一个脚本,能够从网站上检索一些信息。这些信息是受保护的,所以我需要先登录才能阅读它们。我认为这就是我的程序:

  • 首先,使用POST请求登录网站。这里是我的第一个问题:我找到登录表单的页面是这样的。我应该向该页面提交POST请求还是使用其他地址
我已经使用Firefox或Chrome的一些工具测试了标题,但我不知道哪个是正确的过程。我注意到,如果我打开这个登录页面,我会收到一些cookies。如果我删除这些cookie并尝试通过插入用户和密码(通过浏览器)登录,我会收到一个错误作为网站的响应。。它说我需要激活cookies才能登录。因此,当我第一次打开登录页面时,我似乎收到了一些cookies,然后我需要将它们与第一次登录请求一起发送。这对你们有意义吗

这就是我现在使用的代码:

        string formUrl = "https://idp.kk-abcdefg.de/idp/Authn/UserPassword";
        string formParams = string.Format("j_username=MyUserName&j_password=MyPassword”);
        string cookieHeader;
        string pageSource;
        WebRequest req = WebRequest.Create(formUrl);
        req.ContentType = "application/x-www-form-urlencoded";
        req.Method = "POST";
        byte[] bytes = Encoding.ASCII.GetBytes(formParams);
        req.ContentLength = bytes.Length;
        using (Stream os = req.GetRequestStream())
        {
            os.Write(bytes, 0, bytes.Length);
        }
        WebResponse resp = req.GetResponse();
        cookieHeader = resp.Headers["Set-cookie"];

        using (StreamReader sr = new StreamReader(resp.GetResponseStream()))
        {
            pageSource = sr.ReadToEnd();
        }
我相信这是可行的,因为如果我使用了正确的用户/密码,或者我写错了,pageSource的结果就会改变。但是,当用户/密码正确时,我仍然无法登录,因为我收到以下错误消息:“此应用程序需要Cookie。请确保在浏览器的设置中启用了Cookie。请重新加载登录页面,然后再次尝试登录”

这与我在浏览器中禁用cookie或删除首次加载登录页面时得到的cookie时得到的错误相同

你能帮我做这些吗?我的想法是,当我第一次打开登录页面时,我需要保存收到的cookies,然后将它们与以下请求一起发送,但我不知道怎么做


非常感谢

在Web应用程序中,用户成功登录后,会将cookie发送回浏览器,以跟踪用户会话,并确定用户是否在进一步请求期间登录。此外,应用程序的登录过程需要从客户端发送cookie以及用户名和密码。因此,当您尝试在没有浏览器的情况下登录时,它会抱怨缺少cookie

如果您知道登录时需要发送哪些cookie及其值以及用户名和密码,您可以使用WebRequest中的cookieContainer发送它们,如下所示

string formUrl = "https://idp.kk-abcdefg.de/idp/Authn/UserPassword";
string formParams = string.Format("j_username=MyUserName&j_password=MyPassword");

string cookieHeader;
string pageSource;

CookieContainer cookieContainer = new CookieContainer();
Cookie cookie1 = new Cookie("<<cookiename>>", "<<cookievalue>>","/", "<<yourdomainname>>");
Cookie cookie2 = new Cookie("<<cookiename>>", "<<cookievalue>>", "/", "<<yourdomainname>>");
cookieContainer.Add(cookie1);
cookieContainer.Add(cookie2);

// You can keep adding all required cookies this way.
var req = (HttpWebRequest)WebRequest.Create(formUrl);
req.CookieContainer = cookieContainer;

req.ContentType = "application/x-www-form-urlencoded";
req.Method = "POST";
byte[] bytes = Encoding.ASCII.GetBytes(formParams);
req.ContentLength = bytes.Length;
using (Stream os = req.GetRequestStream())
{
    os.Write(bytes, 0, bytes.Length);
}
WebResponse resp = req.GetResponse();
cookieHeader = resp.Headers["Set-cookie"];

// You can access the cookies coming as part of response as following.
HttpWebResponse response = resp as HttpWebResponse;
if(response != null)
{
    var cookiesCollections = response.Cookies;
}

using (StreamReader sr = new StreamReader(resp.GetResponseStream()))
{
    pageSource = sr.ReadToEnd();
}
var loginPageUrl = "<<Your Login Page url>>";
CookieContainer cookieContainer = new CookieContainer();
var req = (HttpWebRequest)WebRequest.Create(loginPageUrl);
req.CookieContainer = cookieContainer;
req.Method = "GET";

WebResponse resp = req.GetResponse();

HttpWebResponse response = resp as HttpWebResponse;

CookieCollection cookies;
if (response != null)
{
    cookies = response.Cookies; //Use this cookies in above code to send with username and password.
}
string formUrl=”https://idp.kk-abcdefg.de/idp/Authn/UserPassword";
string formParams=string.Format(“j_username=MyUserName&j_password=MyPassword”);
线头;
字符串页面源;
CookieContainer CookieContainer=新CookieContainer();
Cookie cookie1=新的Cookie(“,”,“/”,”);
Cookie cookie2=新的Cookie(“,”,“/”,”);
cookieContainer.Add(cookie1);
cookieContainer.Add(cookie2);
//您可以通过这种方式继续添加所有必需的cookie。
var req=(HttpWebRequest)WebRequest.Create(formUrl);
req.CookieContainer=CookieContainer;
req.ContentType=“应用程序/x-www-form-urlencoded”;
请求方法=“POST”;
byte[]bytes=Encoding.ASCII.GetBytes(formParams);
req.ContentLength=字节.Length;
使用(Stream os=req.GetRequestStream())
{
写入(字节,0,字节长度);
}
WebResponse resp=req.GetResponse();
cookieHeader=resp.Header[“设置cookie”];
//您可以访问作为响应的一部分的cookies,如下所示。
HttpWebResponse=响应为HttpWebResponse;
if(响应!=null)
{
var cookiescolections=response.Cookies;
}
使用(StreamReader sr=new StreamReader(resp.GetResponseStream())
{
pageSource=sr.ReadToEnd();
}
如果您不知道Cookie,并且您需要在发布用户名和密码之前通过请求登录页面获取Cookie,然后使用以下命令

string formUrl = "https://idp.kk-abcdefg.de/idp/Authn/UserPassword";
string formParams = string.Format("j_username=MyUserName&j_password=MyPassword");

string cookieHeader;
string pageSource;

CookieContainer cookieContainer = new CookieContainer();
Cookie cookie1 = new Cookie("<<cookiename>>", "<<cookievalue>>","/", "<<yourdomainname>>");
Cookie cookie2 = new Cookie("<<cookiename>>", "<<cookievalue>>", "/", "<<yourdomainname>>");
cookieContainer.Add(cookie1);
cookieContainer.Add(cookie2);

// You can keep adding all required cookies this way.
var req = (HttpWebRequest)WebRequest.Create(formUrl);
req.CookieContainer = cookieContainer;

req.ContentType = "application/x-www-form-urlencoded";
req.Method = "POST";
byte[] bytes = Encoding.ASCII.GetBytes(formParams);
req.ContentLength = bytes.Length;
using (Stream os = req.GetRequestStream())
{
    os.Write(bytes, 0, bytes.Length);
}
WebResponse resp = req.GetResponse();
cookieHeader = resp.Headers["Set-cookie"];

// You can access the cookies coming as part of response as following.
HttpWebResponse response = resp as HttpWebResponse;
if(response != null)
{
    var cookiesCollections = response.Cookies;
}

using (StreamReader sr = new StreamReader(resp.GetResponseStream()))
{
    pageSource = sr.ReadToEnd();
}
var loginPageUrl = "<<Your Login Page url>>";
CookieContainer cookieContainer = new CookieContainer();
var req = (HttpWebRequest)WebRequest.Create(loginPageUrl);
req.CookieContainer = cookieContainer;
req.Method = "GET";

WebResponse resp = req.GetResponse();

HttpWebResponse response = resp as HttpWebResponse;

CookieCollection cookies;
if (response != null)
{
    cookies = response.Cookies; //Use this cookies in above code to send with username and password.
}
var loginPageUrl=”“;
CookieContainer CookieContainer=新CookieContainer();
var req=(HttpWebRequest)WebRequest.Create(loginPageUrl);
req.CookieContainer=CookieContainer;
req.Method=“GET”;
WebResponse resp=req.GetResponse();
HttpWebResponse=响应为HttpWebResponse;
CookieCollection饼干;
if(响应!=null)
{
cookies=response.cookies;//在上述代码中使用此cookies发送用户名和密码。
}

您发送两次请求登录,并使用单个CookieContainer对象

您是否尝试使用Fiddler查看登录后请求上设置了哪些cookie?这样你就可以复制同样的行为。我看到你得到了饼干,但可能没有放在任何地方。切坦,非常感谢!你的解释使我明白了许多事情。不幸的是,它仍然不起作用。我尝试了第二种方法:首先使用GET访问登录页面并获取cookies。然后我用user/pass和CookieContainer.add(cookies)使用POST,其中cookies=response.cookies来自GET。问题是现在我的“cookieHeader=resp.Headers[“Set cookie”];”是空的,所以我没有得到任何回复。。你有什么建议吗?谢谢!您不需要为cookies使用响应头。使用与从get调用中检索cookies相同的方法。即使使用与get相同的方法,我在发布后也不会得到任何回复。。通过对firefox的检查,我注意到我在登录前收到了2个不同的cookie,在登录后又收到了2个(总共4个)。另外两种类型是_pk_ref和_pk_ses,因此它们是Piwik cookies。你认为这可能是我无法登录的原因吗?谢谢我需要登录的这个网站正在使用Shibboleth单点登录(SSO)。。这会让事情变得更困难吗?当您从berowser执行登录时,在输入用户名和密码后,它是否会简单地返回带有cookie的下一页,还是执行任何重定向,然后返回带有cookie的最后一页?可以共享登录页面的url,我可以使用该url重新创建场景。