11

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

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

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

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

有什么我想念的吗?

4

2 回答 2

3

您必须使用反射来查看存储在 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();
    }
于 2013-04-13T07:02:06.320 回答
1

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

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

于 2014-04-15T15:16:40.890 回答