C# 使用HTTP位置头、HttpWebRequest/Response和Response.Cookies.Add()将用户重定向到使用表单身份验证的已验证页面

C# 使用HTTP位置头、HttpWebRequest/Response和Response.Cookies.Add()将用户重定向到使用表单身份验证的已验证页面,c#,asp.net,httpwebrequest,httpwebresponse,http-headers,C#,Asp.net,Httpwebrequest,Httpwebresponse,Http Headers,我需要使用表单身份验证在站点上进行身份验证,然后将用户重定向到该站点以及会话cookie。我还没有想出如何成功地做到这一点。这是我到目前为止的代码。。我仍然会被重定向到应用程序登录页面。非常感谢您的帮助 protected void Button1_Click(object sender, EventArgs e) { string data = "nickname=&login={0}&password={1}&action_login.x=70&action_login.y=14acti

我需要使用表单身份验证在站点上进行身份验证,然后将用户重定向到该站点以及会话cookie。我还没有想出如何成功地做到这一点。这是我到目前为止的代码。。我仍然会被重定向到应用程序登录页面。非常感谢您的帮助


protected void Button1_Click(object sender, EventArgs e)
{
 string data = "nickname=&login={0}&password={1}&action_login.x=70&action_login.y=14action_login=Login";
 string postdata = String.Format(data, "test", "test");
 string page = @"http://1.1.1.1/home.asp";
 string loginPage = @"http://1.1.1.1/auth.asp";
 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(loginPage);
 request.Method = "POST";
 request.ContentType = "application/x-www-form-urlencoded";
 request.AllowAutoRedirect = false;
 ASCIIEncoding encoding = new ASCIIEncoding(); //encoder
 byte[] requestData = encoding.GetBytes(postdata); //encode post data
 request.ContentLength = requestData.Length;
 //write the post data to the request
 Stream requestStream = request.GetRequestStream();
 // Send the data.
 requestStream.Write(requestData, 0, requestData.Length);
 requestStream.Close();
 try
 {
  HttpWebResponse response = (HttpWebResponse) request.GetResponse();
  string cookieHeader = response.GetResponseHeader("Set-Cookie");
  string cookieValue = cookieHeader.Replace("pp_session_id=", "");
  HttpCookie cookie = new HttpCookie("pp_session_id",cookieValue);
  cookie.Domain = "1.1.1.1";
  cookie.Path = "/";
  Response.Clear();
  Response.StatusCode = 302;
  //Response.AddHeader("Set-Cookie", cookieHeader);
  Response.AddHeader("Location",page);
  Response.RedirectLocation = page;
  Response.Cookies.Add(cookie);
  Response.Flush();

 }
 catch (WebException ex)
 {
  Response.Write(ex.Message);
 }
}

使用该类有什么问题?特别是,您是否尝试过以下顺序(或其变体):

格式验证。
()

格式验证。
()


格式验证。
()

使用Mozilla Firefox上的Firebug查看浏览器在登录webapp时的具体操作。然后通过代码模拟相同的序列

或者,您可以使用wireshark嗅探浏览器发送的请求

从您的代码中我可以看到一件事,就是您显式地添加了cookie。你不应该这样做。您应该在请求上设置CookieContainer,以便将Cookie与所有请求一起发送到该站点


希望这会有所帮助。

我相信您必须请求远程web应用程序上经过身份验证的页面


你必须抓住它提供给你的cookie,这样你就有了一个有效的会话。aspnet会话id在cookie中传递。然后,您需要将该应用程序所需的用户名和密码与收到的cookie一起传递,这样您就可以进行有效的身份验证会话。

由于远程站点不是ASP.NET应用程序OK,再次阅读您的问题时,我想我没有完全理解它。您要做的是,在中间使用一个人,它对后端ASP应用程序进行FBA身份验证,然后将cookie传递给客户端。在这样做时,它会适当地设置域和路径。我建议您在asp.net应用程序和远程asp应用程序之间以及从直接指向asp应用程序的浏览器进行网络嗅探。看看cookie/URL之间有什么区别。可能是ASP服务器在cookie中对客户端(在本例中为ASP.net应用程序)的主机名进行了编码,所以当来自客户端的请求被拒绝时,它会拒绝。这正是我试图做的。我用fiddler2分析了流量,唯一缺少的是P3P头,但它似乎没有将cookie附加到重定向请求上。ASP应用程序是第三方的,所以我不知道它是如何创建会话id的。我研究这个问题的原因是我正在编写一个反向代理,无法运行特定的Java小程序,因此我想为用户启动一个直接连接,而无需用户进行身份验证。您是否从浏览器->代理中获得网络嗅探,以及从代理->asp.net服务器?您确定cookie是从代理->ASP应用发送的吗?你对ASP服务器有控制权吗?是否有可能找出服务器不喜欢您发送的cookie的原因?好的,在再次阅读您的代码时,我认为您的操作方式存在缺陷。假设您的aspnet服务器位于地址1.2.3.4。从这里开始,您将尝试对1.1.1.1进行FBA。您正在获取后端发送的cookie,并将其发送到H浏览器。当浏览器获得cookie时,域将为1.1.1.1,但浏览器正在与服务器1.2.3.4(中间人)通信。因此,浏览器将不接受该cookie。如果它这样做了,那么就有可能污染任何人的cookie缓存。请分享你最终是如何解决这个问题的。我正在实施某种单点登录系统,我被困在这里。我需要使用已知凭据自动登录用户。