HttpWebRequest模拟登录在IIS上不好用

微醺_zZ 2017-11-08 10:44:39
在VS上做了一个HttpWebRequest实现模拟登录,请求登录接口正常生成Session并保存到Cookie中,VS调试可以正常跳转至登录后的页面,但发布到IIS后跳转提示未登录。调试发现请求登录后的跳转页,目标站点无法获取到Session,求解

[DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool InternetSetCookie(string lpszUrlName, string lbszCookieName, string lpszCookieData);

/// <summary>
/// 获取CookieCollection
/// </summary>
/// <param name="loginUrl"></param>
/// <param name="postdata"></param>
/// <param name="header"></param>
/// <returns></returns>
public static CookieCollection GetCookieCollection(string loginUrl, string postdata)
{
HttpWebRequest request = null;
HttpWebResponse response = null;
try
{
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
CookieContainer cc = new CookieContainer();
request = (HttpWebRequest)WebRequest.Create(loginUrl);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
byte[] postdatabyte = Encoding.UTF8.GetBytes(postdata);
request.ContentLength = postdatabyte.Length;
request.AllowAutoRedirect = false;
request.CookieContainer = cc;
request.KeepAlive = true;
// TODO:跳过代理身份验证
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback
(
delegate { return true; }
);
//提交请求
Stream stream;
stream = request.GetRequestStream();
stream.Write(postdatabyte, 0, postdatabyte.Length);
stream.Close();

//接收响应
response = (HttpWebResponse)request.GetResponse();
response.Cookies = request.CookieContainer.GetCookies(request.RequestUri);
CookieCollection cook = response.Cookies;
//Cookie字符串格式
//string strcrook = request.CookieContainer.GetCookieHeader(request.RequestUri);
return cook;
}
catch (Exception ex)
{
throw ex;
}
}

protected void button_Click(object sender, EventArgs e)
{
Response.Write(System.Security.Principal.WindowsIdentity.GetCurrent().Name);
Dictionary<string, string> postParams = new Dictionary<string, string>();
postParams.Add("userName", "admin");
postParams.Add("userPwd", "XXXXX");

// 要提交的字符串数据。格式形如:user=uesr1&password=123
string postString = "";
int cnt = 0;
foreach (KeyValuePair<string, string> de in postParams)
{
string str = "";
if (cnt < postParams.Count - 1)
{
str = "&";
}
//把提交按钮中的中文字符转换成url格式,以防中文或空格等信息
postString += System.Web.HttpUtility.UrlEncode(de.Key.ToString()) + "=" + System.Web.HttpUtility.UrlEncode(de.Value.ToString()) + str;
cnt++;
}

CookieCollection mycookie = GetCookieCollection("http://X.X.X.X:8080/api/login", postString);


foreach (Cookie cookie in mycookie) //将cookie设置为浏览的cookie
{
HttpCookie cookies = new HttpCookie("CurrentUser");
cookie.Domain = cookie.Domain.ToString();
cookies[cookie.Name.ToString()] = cookie.Value.ToString();
cookies.Expires = DateTime.Now.AddMinutes(30);
Response.Cookies.Add(cookies);
cookie.HttpOnly = false;

//InternetSetCookie(

// "http://" + cookie.Domain.ToString(),

// cookie.Name.ToString(),

// cookie.Value.ToString()
// //);
// + ";expires=" + DateTime.Now.AddDays(1).ToString("r"));

}
//Response.Cookies
Response.Write(" <script language=javascript>window.location.href=\"http://X.X.X.X:8080/index.html;\"</script>");
}
...全文
263 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
微醺_zZ 2017-11-13
  • 打赏
  • 举报
回复
引用 6 楼 net_lover 的回复:
HttpWebRequest是运行在服务器上的,是不写入你浏览器的Cookie的。HttpWebRequest的作用可以看成浏览器。而不是你自己的浏览器。
嗯,这个理解了,我也用IISExpress试过了,局域网其他机器访问也不能写Cookie。看来要在客户端写Cookie只能在客户端实现 最终解决方案是在页面生成一个IFrame,内嵌一个表单,但也遇到了个问题,就是JQuery 的AjaxSubmit不支持IE9,我们有个对接的系统还只能用IE9,真是醉了
孟子E章 2017-11-11
  • 打赏
  • 举报
回复
HttpWebRequest是运行在服务器上的,是不写入你浏览器的Cookie的。HttpWebRequest的作用可以看成浏览器。而不是你自己的浏览器。
江湖评谈 2017-11-11
  • 打赏
  • 举报
回复
express 是个精简版的IIS ,直接布置到IIS上调试,应该可以找出问题。
YeomanAmj 2017-11-11
  • 打赏
  • 举报
回复

这个是什么鬼???
微醺_zZ 2017-11-08
  • 打赏
  • 举报
回复
引用 2 楼 hanjun0612 的回复:
我没这么玩过。 CookieContainer cc = new CookieContainer(); request.CookieContainer = cc; http://bbs.csdn.net/topics/390635972
我现在用浏览器打开登录后的页面返回的是302错误, 抓包不带Cookie,一周了,没办法解决, 用WebRequest请求可以通过,可页面没法在浏览器里显示啊,代码如下: VS的IISExpress调试一切正常,Cookie可以被写到浏览器,但发布到IIS上就不行了,疯了啊……

/// <summary>
        /// 通过POST方式发送数据
        /// </summary>
        /// <param name="Url">url</param>
        /// <param name="postDataStr">Post数据</param>
        /// <param name="cookie">Cookie容器</param>
        /// <returns></returns>
        public static string SendDataByPost(string Url, string postDataStr, ref CookieContainer cookie)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
            if (cookie.Count == 0)
            {
                request.CookieContainer = new CookieContainer();
                cookie = request.CookieContainer;
            }
            else
            {
                request.CookieContainer = cookie;
            }

            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded";
            request.ContentLength = postDataStr.Length;
            Stream myRequestStream = request.GetRequestStream();
            StreamWriter myStreamWriter = new StreamWriter(myRequestStream, Encoding.GetEncoding("gb2312"));
            myStreamWriter.Write(postDataStr);
            myStreamWriter.Close();

            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            Stream myResponseStream = response.GetResponseStream();
            StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
            string retString = myStreamReader.ReadToEnd();
            myStreamReader.Close();
            myResponseStream.Close();

            return retString;
        }
SendDataByPost("http://X.X.X.X/index.html", postString, ref cc);
正怒月神 版主 2017-11-08
  • 打赏
  • 举报
回复
我没这么玩过。 CookieContainer cc = new CookieContainer(); request.CookieContainer = cc; http://bbs.csdn.net/topics/390635972
微醺_zZ 2017-11-08
  • 打赏
  • 举报
回复
自己抓包看了一下,最后跳转的时候发送的请求没有带Cookie,怎么让浏览器打开指定网址带着Cookie?

62,051

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧