2013-03-22 7 views
11

HTTPS를 통해 API에 사용자 이름과 암호를 보내는 앱이 있습니다. API는 HTTPOnly 쿠키를 반환합니다.Windows Phone에서 HTTPOnly 쿠키 보존

이것은 쿠키가 코드에 "보이지"않지만 여전히 존재하며 이후 요청에서 서버로 전송된다는 것을 의미합니다.

Set-Cookie 헤더는 HttpWebResponse.Headers에서 제거되고, 쿠키는 HttpWebResponse.Cookie의 또는 HttpWebRequest.CookieContainer에 나타나지 않습니다. 그러나 후속 요청이 동일한 HttpWebRequest.CookieContainer을 사용하여 이루어지면 서버에 전송되지만 코드에 액세스 할 수 없습니다.

내가 알 수있는 한, 이것은 어떤 식 으로든 직렬화하거나 보존하는 것을 불가능하게 만듭니다. 이 작업을 수행하는 유일한 방법은 실제 사용자 이름과 암호를 캐싱하고 매번 다시 로그인하는 것입니다.

누락 된 것이 있습니까?

+0

'CookieContainer' (http://answers.flyppdevportal.com/categories/metro/csharpvb.aspx?ID=d214c388-41de-44b7-8260-9e21f3fcb859) 전체를 직렬화하고 필요할 때 전체 컨테이너를 재사용 할 수 있습니까? – keyboardP

+0

httponly 쿠키를 조작 할 수 없습니다. http 요청을 보낼 때만 수정됩니다. 서버와 클라이언트 간의 안전한 통신에 필수적입니다. 그래서 당신이 직면하고있는이 행동은 정상입니다. – user568109

+0

@keyboardP CookieContainer를 직렬화하면 병합되지 않은 쿠키가 더 이상 전송되지 않습니다. – zi3guw

답변

3

리플렉션을 사용하여 쿠키 컨테이너에 저장된 쿠키를 확인해야합니다.

보유하고있는 것을 살펴 보려면 원하는 것을 사용하십시오. 그런 다음 원하는 데이터에 액세스하기 위해 하위 클래스를 만들거나 메모리에 쿠키를 저장하는 과정을 거치거나 컨테이너에서 삭제하거나, 정상 쿠키로 추가하십시오.

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(); 
    } 
+0

리플렉션을 사용하여 Windows Phone에서 비공개 유형에 액세스 할 때 MethodAccessException을 얻지 못합니까? 시도 할 때마다 실패했습니다 – calum

+0

좋은 catch 내부 및 보호 된 있어야합니다.하지만 개인 확실히 아닙니다 .CookieContainer에 대한 원본을보고,이 작동합니다. 그렇지 않으면 매트 될 것입니다. 소스를 기반으로 사용자 정의 쿠키 컨테이너 클래스를 작성하고이를 대신 활용할 수 있습니다. –

+0

WP8 (Hashtable, SortedList가 없습니다)에서이 코드를 컴파일 할 수 없습니다. – altso

1

쿠키를 직접 가져올 수도 있습니다. 다음은 비슷한 질문에 대한 대답입니다. https://stackoverflow.com/a/21737087/262036

응답을 받으면 쿠키를 검색 할 때 문자열을 구문 분석하고 값을 가져옵니다. 그 후 당신은 HttpOnly가 아닌 새로운 쿠키를 CookieContainer에 생성하여 다음 요청에 사용할 수 있습니다.