网络响应cookie

本文关键字:cookie 响应 网络 | 更新日期: 2023-09-27 17:57:41

使用WebRequestWebResponse,我可以将登录信息发布到外部站点,并在Response.Cookies和我的CookieContainer中接收cookie。我知道这是有效的,因为在相同的过程中,我可以请求不同的页面,而不会被重定向到登录页面。这个cookie使我可以在不登录每个页面视图的情况下留在网站上。

我现在正尝试使用Response.Cookies.Add(httpCookie)将cookie添加到客户端的浏览器中;

然而,它只会一直持续到手术结束。重新加载页面,cookie将不再可用。

我做错了什么?

网络响应cookie

您从WebResponse从外部站点接收的cookie不能传递到您自己的客户端浏览器上。这是因为cookie模型固有的安全限制:浏览器不支持一个域为另一个域设置cookie。

这可能会一直持续到当前请求结束,因为您只是从刚刚添加cookie的HttpCookieCollection中读取。此集合将持续到当前HTTP请求结束。

然而,老实说,我不确定你是如何做到这一点的,因为System.Net.HttpWebResponseCookieContainer使用System.Net.Cookie,而Response.Cookies集合使用System.Web.HttpCookie

无论如何,您最好的选择可能是将您在WebResponse中获得的cookie的值存储到您发送到浏览器的自己的cookie中。然后,根据将来的请求,读取您自己的cookie,为外部站点构造一个新的Cookie,并手动将其添加到CookieContainer中。

这里有一些伪代码,假设外部网站正在寻找的cookie名为"sessionKey",我们使用"myCookie"作为发送到客户浏览器的cookie的名称:

public ActionResult MyAction()
{
    var container = new CookieContainer();
    if (Request.Cookies["myCookie"] != null)
    {
         // browser has passed in "myCookie".
         // use this to create the "sessionKey" cookie to send.
         var cookie = new System.Net.Cookie("sessionKey",
             Request.Cookies["myCookie"].Value, "/", "external-site.com");
         container.Add(cookie);
    }
    HttpWebRequest request;
    HttpWebResponse response;
    // initialize the request.
    // ...
    // make sure we're using our cookie container.
    request.CookieContainer = container;
    // execute the request and get the response.
    response = request.GetResponse();
    // send a cookie, "myCookie", to the browser.
    // it will contain the value of the "sessionKey" cookie.
    Response.Cookies["myCookie"].Value = response.Cookies["sessionKey"].Value;
}