C# 在Windows Phone上保留HTTPOnly Cookie

C# 在Windows Phone上保留HTTPOnly Cookie,c#,.net,http,windows-phone-8,windows-phone,C#,.net,Http,Windows Phone 8,Windows Phone,我有一个通过HTTPS向API发送用户名和密码的应用程序。API返回HTTPOnly cookies 这意味着cookie对代码“不可见”,但仍然存在,并将在后续请求中发送到服务器 Set Cookie标题从HttpWebResponse.Headers中剥离,Cookie不会出现在HttpWebResponse.Cookies或HttpWebRequest.CookieContainer中。但是,如果使用相同的HttpWebRequest.CookieContainer发出后续请求,则会将它们

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

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

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

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


我缺少什么吗?

您必须使用反射来查看存储在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();
    }
公共列表GetAllCookie(CookieContainer cc)
{
List lstCookies=新列表();
Hashtable=(Hashtable)cc.GetType().InvokeMember(“m_domainTable”,System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField | System.Reflection.BindingFlags.Instance,null,cc,new object[]{});
foreach(table.Values中的var路径列表)
{
SortedList lstCookieCol=(SortedList)pathList.GetType().InvokeMember(“m_list”,System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField | System.Reflection.BindingFlags.Instance,null,路径列表,新对象[]{});
foreach(lstCookieColl.Values中的CookieCollection colCookies)
foreach(colCookies中的cookiec)lstCookies.Add(c);
}
返回cookies;
}
公共字符串ShowAllCookies(CookieContainer cc)
{
StringBuilder sb=新的StringBuilder();
List lstCookies=GetAllCookies(cc);
某人的附录(“=======================================================================================================”);
sb.AppendLine(lstCookies.Count+“cookies found.”);
某人的附录(“=======================================================================================================”);
int-cpt=1;
foreach(cookies中的Cookie c)
sb.AppendLine(“#”+cpt++”>Name:“+c.Name+”\tValue:“+c.Value+”\tDomain:“+c.Domain+”\tPath:“+c.Path+”\tExp:“+c.Expires.ToString());
使某人返回字符串();
}

您还可以尝试使用TCP套接字直接获取cookie。下面是我对一个类似问题的回答:


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

您可以序列化整个
CookieContainer
()并在需要时重用整个容器吗?您无法操作HttpOnly cookie。仅当您发送http请求时,才会修改它们。这对于服务器和客户端之间的安全通信至关重要。因此,您面临的这种行为是正常的。@keyboard p如果您序列化CookieContainer,当它未序列化时,Cookie将不再发送。我目前正在研究相同的问题。为了确保我理解正确:您确实为您的HttpWebRequest分配了一个新的Cookie容器,并且在HttpWebResponse中得到了一个空的CookieContainer。但是,您使用此容器并将其传递给所有后续请求,是否使用收到的httponly cookies?从我的阅读资料来看,我支持user568109的论点,即不可能在cookie容器中处理httponly cookie对象。这就是为什么它可能总是空的:(有可能是NewsBlur API吗?这就是我遇到的问题,我唯一的解决方案是每次应用启动时都登录。我希望很快可以移动到oauth…在使用反射访问Windows Phone上的非公共类型时,你没有得到MethodAccessException吗?每次我尝试这样做都失败了。很好,catch.internal和protected应该可以,但private肯定不行。查看CookieContainer的源代码,这应该可以。如果不行,则需要基于源代码构建自定义cookie容器类并加以利用。我甚至无法在WP8上编译此代码(缺少哈希表和SortedList)@altso-您应该能够非常轻松地调整代码,以使用列表和字典集合。这只是一个示例。概念保持不变。@zaitsman我想不起任何细节,但我无法使此代码正常工作。