我怎样才能获得的HttpOnly在Windows Phone 8的饼干?(How can I get

2019-09-01 10:13发布

我在了Windows Phone 8 PCL项目。 我使用的是第三方的REST API,我需要使用源于由API少数的HttpOnly饼干。 除非你使用反射或其他一些后门好像越来越/从HttpClientHandler的访问的CookieContainer的仅Http饼干是不可能的。

我需要得到这些cookie并在后续请求给他们,否则我不会能够与这个API的工作 - 我怎样才能做到这一点? 这里是我的当前请求的代码如下所示:

提前致谢。

//Some request
HttpRequestMessage request = new HttpRequestMessage();
HttpClientHandler handler = new HttpClientHandler();

//Cycle through the cookie store and add existing cookies for the susbsequent request
foreach (KeyValuePair<string, Cookie> cookie in CookieManager.Instance.Cookies)
{
            handler.CookieContainer.Add(request.RequestUri, new Cookie(cookie.Value.Name, cookie.Value.Value));
}

//Send the request asynchronously
HttpResponseMessage response = await httpClient.SendAsync(request);
response.EnsureSuccessStatusCode();

//Parse all returned cookies and place in cookie store
foreach (Cookie clientcookie in handler.CookieContainer.GetCookies(request.RequestUri))
{
     if (!CookieManager.Instance.Cookies.ContainsKey(clientcookie.Name))
                CookieManager.Instance.Cookies.Add(clientcookie.Name, clientcookie);
            else
                CookieManager.Instance.Cookies[clientcookie.Name] = clientcookie;
}

HttpClient httpClient = new HttpClient(handler);

Answer 1:

中HTTPOnly Cookie是在里面的CookieContainer,它只是没有被曝光。 如果设置的CookieContainer的同一个实例到下一个请求时,它会设置隐藏的cookie存在(只要请求发送到同一站点cookie的指定制)。

该解决方案将工作,直到你需要序列化和反序列化的CookieContainer,因为你正在恢复状态。 一旦你这样做,你失去了隐藏的CookieContainer里面的HttpOnly饼干。 因此,一个更持久的解决办法是直接使用套接字该请求,读取原始请求作为一个字符串,提取cookie,并把它设置为下一个请求。 下面是在Windows Phone 8的使用套接字的代码:

public async Task<string> Send(Uri requestUri, string request)
{
   var socket = new StreamSocket();
   var hostname = new HostName(requestUri.Host);
   await socket.ConnectAsync(hostname, requestUri.Port.ToString());

   var writer = new DataWriter(socket.OutputStream);
   writer.WriteString(request);
   await writer.StoreAsync();

   var reader = new DataReader(socket.InputStream) 
   { 
      InputStreamOptions = InputStreamOptions.Partial 
   };
   var count = await reader.LoadAsync(512);

    if (count > 0)
      return reader.ReadString(count);
    return null;
}


Answer 2:

还有第二种可能性 - 手动完成响应头,抢,然后解析使用大量的自定义代码设置Cookie头。

它看起来类似的东西,当你要匹配,并且保存单个PHPSESSID的cookie(假设LatestResponse是你HttpResponseMessage包含网站响应):

if (LatestResponse.Headers.ToString().IndexOf("Set-Cookie:") != -1) try
        {
            string sid = LatestResponse.Headers.ToString();
            sid = sid.Substring(sid.IndexOf("Set-Cookie:"), 128);
                if (sid.IndexOf("PHPSESSID=") != -1)
                {
                    settings.Values["SessionID"] = SessionID = sid.Substring(sid.IndexOf("PHPSESSID=") + 10, sid.IndexOf(';') - sid.IndexOf("PHPSESSID=") - 10);
                    handler.CookieContainer.Add(new Uri("http://example.com", UriKind.Absolute), new System.Net.Cookie("PHPSESSID", SessionID));
                }
        } catch (Exception e) { 
            // your exception handling
        }

注意:此代码插入了cookie来CookieContainer该对象的生活,除非手动删除。 如果你想将其纳入一个新的对象,只是将正确的设定值,并把它添加到您的新的容器。



文章来源: How can I get HttpOnly cookies in Windows Phone 8?