在Windows Phone preserving的HttpOnly饼干饼干、Phone、Windows、HttpOnly

2023-09-03 03:17:51 作者:骨子里的坚强i

我有一个应用程序,通过HTTPS发送的用户名和密码的API。该API返回的HttpOnly饼干。

I have an app that sends a username and password to an API via HTTPS. The API returns HTTPOnly cookies.

这意味着,饼干看不见code,但仍然存在,将被发送到服务器在后续请求。

This means that the cookies are "invisible" to the code, but still exist and will be sent to the server in subsequent requests.

设置Cookie 头从剥离 HttpWebResponse.Headers 和cookie不出现在 HttpWebResponse.Cookie s或在 HttpWebRequest.CookieContainer 。然而,如果随后的请求是使用由相同的 HttpWebRequest.CookieContainer 它们被发送到服务器,但它们无法进入code

The Set-Cookie header is stripped from the HttpWebResponse.Headers and the cookie does not appear in the HttpWebResponse.Cookies or the HttpWebRequest.CookieContainer. However, if a subsequent request is made using that same HttpWebRequest.CookieContainer they are sent to the server, but they are inaccessible to the code.

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

As far as I can tell, this makes them impossible to serialize or preserve in any way. It seems the only way to make this work will be to cache the actual username and password and login again every time.

有我丢失的东西?

推荐答案

您将不得不使用反射来看看存储在cookie中容器的饼干。

You'll have to use reflection to take a look at the Cookies stored in the cookie container.

使用这样的事情来看看你有什么,那么你可以尝试的子类来访问你想要或通过在内存中存储的cookie,从容器中删除它的处理数据,然后将其添加为正常的cookie

Use something like this to have a look at what you have, then you can either try to subclass to gain access to the data you want or go through the process of storing the cookie in memory, deleting it from the container, then adding it as a normal 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();
    }