简体   繁体   English

HttpWebRequest和C#中的表单身份验证

[英]HttpWebRequest and forms authentication in C#

I am a systems guy and currently doing a part time web development project so am pretty new to it. 我是一个系统人员,目前正在做兼职Web开发项目,所以我很陌生。 I am trying to write a http client for www.portapower.com. 我正在尝试为www.portapower.com编写一个http客户端。

It will for certain items which are posted on the website and if they match a particular requirement it will print a message. 对于在网站上发布的某些项目,如果它们符合特定要求,它将打印一条消息。

While trying to access this page: 在尝试访问此页面时:

http://www.portapower.com/getbainfo.php?fclasscode=1&code=CB1831B.40H&fbrand=QUNFUg== http://www.portapower.com/getbainfo.php?fclasscode=1&code=CB1831B.40H&fbrand=QUNFUg==

The website redirects me to a default register page: 该网站将我重定向到默认注册页面:

http://www.portapower.com/defaregit.php http://www.portapower.com/defaregit.php

Here is a snippet of what I coded: 这是我编码的片段:

CookieContainer myContainer = new CookieContainer();

HttpWebRequest request = (HttpWebRequest)
WebRequest.Create("http://www.portapower.com/" + urlpart);
request.Credentials = new NetworkCredential("****", "******");
request.CookieContainer = myContainer;
request.PreAuthenticate = true;
request.Method = "POST";
HttpWebResponse response = (HttpWebResponse)
request.GetResponse();

Console.WriteLine(response.StatusCode);
Stream resStream = response.GetResponseStream();
Console.WriteLine(resStream.ToString());

I do have the username and password and it works fine when used from a browser. 我有用户名和密码,从浏览器使用时工作正常。 Please tell me if this a correct way to access a authenticated page. 请告诉我这是否是访问经过身份验证的页面的正确方法。

It depends on how the website is authenticating users. 这取决于网站如何验证用户。 If they are using basic authentication or Windows authentication, then you can set the Credentials property of the HttpWebRequest class to the username/password/domain information and it should work. 如果他们使用的是基本身份验证或Windows身份验证,那么您可以将HttpWebRequestCredentials属性设置为用户名/密码/域信息,它应该可以正常工作。

However, it sounds like you have to enter the username/password on the site, which means you are going to have to login to the site first. 但是,听起来您必须在网站上输入用户名/密码,这意味着您必须先登录该网站。 Looking at the main page, this is what I find in the <form> element that handles login: 查看主页面,这是我在处理登录的<form>元素中找到的内容:

<form name="formlogin" method="post" action="./defalogin.php" >
  <input name="emtext" type="text" id="emtext" size="12">
  <input name="pstext" type="password" id="pstext" size="12">
  <input type="submit" name="Submit" value="Logn in" 
    onClick="return logincheck()" >
</form>

I've included only the relevant portions. 我只包括相关部分。

Given this, you have to go to the ./defalogin.php page first with the HttpWebRequest and POST the emtext and pstext values. 鉴于此,您必须首先使用HttpWebRequest转到./defalogin.php页面,然后pstext emtextpstext值。 Also, make sure you set the CookieContainer property to an instance of CookieContainer . 此外,请确保您的设定CookieContainer属性 ,以实例CookieContainer When that call to POST returns, it's more than likely going to be populated with a cookie which you will have to send back to the site. 当对POST的调用返回时,很可能会填充一个cookie,您必须将其发送回该站点。 Just keep setting the CookieContainer property on any subsequent HttpWebRequest instances to that CookieContainer to make sure the cookies are passed around. 只需继续将CookieContainer属性设置在任何后续的HttpWebRequest实例上,以确保Cookie被传递到该CookieContainer

Then you would go to the page indicated in the link. 然后,您将转到链接中指示的页面。

Of concern is also the logincheck javascript function, but looking at the script sources, it does nothing of note. 值得关注的还有logincheck javascript函数,但是看一下脚本源代码,它没有什么值得注意的。

The credentials that you are passing is for windows authentication. 您传递的凭据是用于Windows身份验证。 You need to submit post data with data that mimics the submission of a form then captrue the session cookie set in the response ans use that cookie for future requests 您需要提交包含模仿提交表单的数据的帖子数据,然后限制响应中设置的会话cookie,并使用该cookie以备将来请求

Take a look at this answer which has the code to do this: 看看这个答案,它有代码来做到这一点:

Login to the page with HttpWebRequest 使用HttpWebRequest登录页面

You can't do it this way; 你不能这样做; the credentials you're passing can be used with a basic authentication scheme (ie where, in the browser, you get a username/password dialog popping up.) You'll have to simulate the entry of the data into that form and catch the login cookie and use that. 您传递的凭据可以与基本身份验证方案一起使用(即,在浏览器中,您会弹出一个用户名/密码对话框。)您必须模拟数据在该表单中的条目并捕获登录cookie并使用它。

The NetworkCredential class is really for controlling regular windows credentials (NTLM, Kerberos, etc). NetworkCredential类实际上用于控制常规Windows凭据(NTLM,Kerberos等)。

That site is a PHP site running on Apache, so I don't think they are using NTLM or kerberos. 该站点是在Apache上运行的PHP站点,因此我认为他们不使用NTLM或kerberos。

What you want to do is post some FORM fields to the site, then keep the cookie you get back. 你想要做的是将一些FORM字段发布到网站,然后保留你回来的cookie。 Make sure on subsequent requests you push the cookie back to the site so it knows you've already logged in. 确保在后续请求中将cookie推回到站点,以便它知道您已经登录。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM