在Windows Phone上保留HTTPOnly cookie

本文关键字:HTTPOnly cookie 保留 Windows Phone | 更新日期: 2023-09-27 18:05:26

我有一个应用程序,通过HTTPS发送用户名和密码到API。API返回HTTPOnly cookie。

这意味着cookie对代码是"不可见的",但仍然存在,并将在后续请求中发送给服务器。

Set-Cookie报头从HttpWebResponse.Headers中剥离,并且cookie不出现在HttpWebResponse.Cookie s或HttpWebRequest.CookieContainer中。但是,如果使用相同的HttpWebRequest.CookieContainer发出后续请求,则它们被发送到服务器,但代码无法访问它们。

据我所知,这使得它们无法序列化或以任何方式保存。似乎唯一的方法,使这项工作将是缓存实际的用户名和密码,并再次登录每次。

我错过了什么吗?

在Windows Phone上保留HTTPOnly cookie

您必须使用反射来查看存储在cookie容器中的cookie。

使用像这样的东西来看看你有什么,然后你可以尝试子类来访问你想要的数据或者经历将cookie存储在内存中,从容器中删除,然后将其作为普通cookie添加的过程

    public List<Cookie> GetAllCookies(CookieContainer cc)
    {
        List<Cookie> lstCookies = new List<Cookie>();
        Hashtable table = (Hashtable)cc.GetType().InvokeMember("m_domainTable", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField | System.Reflection.BindingFlags.Instance, null, cc, new object[] { });
        foreach (var pathList in table.Values)
        {
            SortedList lstCookieCol = (SortedList)pathList.GetType().InvokeMember("m_list", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField | System.Reflection.BindingFlags.Instance, null, pathList, new object[] { });
            foreach (CookieCollection colCookies in lstCookieCol.Values)
                foreach (Cookie c in colCookies) lstCookies.Add(c);
        }
        return lstCookies;
    }
    public string ShowAllCookies(CookieContainer cc)
    {
        StringBuilder sb = new StringBuilder();
        List<Cookie> lstCookies = GetAllCookies(cc);
        sb.AppendLine("=========================================================== ");
        sb.AppendLine(lstCookies.Count + " cookies found.");
        sb.AppendLine("=========================================================== ");
        int cpt = 1;
        foreach (Cookie c in lstCookies)
            sb.AppendLine("#" + cpt++ + "> Name: " + c.Name + "'tValue: " + c.Value + "'tDomain: " + c.Domain + "'tPath: " + c.Path + "'tExp: " + c.Expires.ToString());
        return sb.ToString();
    }

您也可以尝试使用TCP套接字直接获取cookie。下面是我对类似问题的回答:https://stackoverflow.com/a/21737087/262036

获得响应后,解析字符串以搜索cookie并获取值。之后,您可以在CookieContainer中创建一个不是HttpOnly的新cookie,并在接下来的请求中使用它。