2013-02-24 2 views
7

나는 webbrowser control이있는 windows forms 앱을 만들고 있습니다. 사용자가 webbrowser에 로그인 한 후로그인 할 웹 브라우저 받기

, 나는 Microsoft.Http.HttpClient 또는 HttpWebRequest 또는 유사한과 같은 계정으로도 로그인 할, 그것은 PHP에서 cURL 유사해야합니다.

문제는 웹 페이지가 계정 당 싱글 사인온 만 허용하고, HttpClient로 로그인하면 웹 브라우저를 걷어차는 것입니다. 이 webbrowser 세션을 가로 채거나 cookies을 얻고 HttpClient 또는 유사한 api 내에서 사용할 수있는 경우

내가 알고 싶은.

데이터를 얻으려면 webbrowser.Cookie을 사용할 수 있지만이를 HttpClient으로 푸시하는 방법은 무엇입니까?

그런 종류의 일도 가능합니다. 쿠키를 가져 와서 동일한 세션을 사용할 수 있습니까? 그렇다면 어떻게?

+0

쿠키는 Http 만을하는 경우 쿠키는 다음 웹 브라우저는 보관하지 않습니다. [IEGetProtectedModeCookie] (https://msdn.microsoft.com/en-us/library/cc196998(v=vs.85).aspx) –

답변

12

있어 도움이 여기에서 :

Is it possible to transfer authentication from Webbrowser to WebRequest

이 Alkampfer 솔루션을 기록했다. 이것은 내가 필요로했던 것과 정확히 일치한다.

이 솔루션은 또한 Http only 쿠키가 필요합니다.

WebRequest 개체를 사용하여 이후 호출에 사용할 수있는 CookieContainer를 반환하는 GetUriCookieContainer 메서드를 호출 할 수 있습니다.

[DllImport("wininet.dll", SetLastError = true)] 
    public static extern bool InternetGetCookieEx(
     string url, 
     string cookieName, 
     StringBuilder cookieData, 
     ref int size, 
     Int32 dwFlags, 
     IntPtr lpReserved); 

    private const Int32 InternetCookieHttponly = 0x2000; 

/// <summary> 
/// Gets the URI cookie container. 
/// </summary> 
/// <param name="uri">The URI.</param> 
/// <returns></returns> 
public static CookieContainer GetUriCookieContainer(Uri uri) 
{ 
    CookieContainer cookies = null; 
    // Determine the size of the cookie 
    int datasize = 8192 * 16; 
    StringBuilder cookieData = new StringBuilder(datasize); 
    if (!InternetGetCookieEx(uri.ToString(), null, cookieData, ref datasize, InternetCookieHttponly, IntPtr.Zero)) 
    { 
     if (datasize < 0) 
      return null; 
     // Allocate stringbuilder large enough to hold the cookie 
     cookieData = new StringBuilder(datasize); 
     if (!InternetGetCookieEx(
      uri.ToString(), 
      null, cookieData, 
      ref datasize, 
      InternetCookieHttponly, 
      IntPtr.Zero)) 
      return null; 
    } 
    if (cookieData.Length > 0) 
    { 
     cookies = new CookieContainer(); 
     cookies.SetCookies(uri, cookieData.ToString().Replace(';', ',')); 
    } 
    return cookies; 
} 
1

나는 당신이 기술을 약간 너무 길게 늘릴 것이라고 생각한다. Windows 양식의 Webbrowser 컨트롤은 보통 로컬 파일이나 인터넷에서 기본 html 렌더링을 제공하도록 설계되었지만 완전한 웹 브라우저를 대체하는 데 사용해서는 안됩니다.

SSO 공급자를 인증하려면 Windows Identitity Foundation의 올바른 라이브러리 (Microsoft.IdentityModel)를 사용해야하며 SSO 공급자의 클레임을 처리하는 클레임 ​​인증 메커니즘을 사용해야합니다. 쿠키는 응용 프로그램간에 공유 할 수 없습니다. 실제로 새로운 웹 기술은이를 방지하기 위해 설계되었으므로 제 생각에는 웹 브라우저 컨트롤 대신 WIF를 사용하십시오.

당신이 할 수있는

+1

나는 그것이 'SSO 제공자'라고 생각하지 않는다. 같은 시간에 계정에 두 개의 연결을 차단 자바 스크립트 또는 이와 유사한. – Jaanus

3

, 희망이 도움이,하지만 조금 까다로운. HttpWebRequest의 CookieContainer와 함께 InternetSetCookie 호출을 사용하십시오.

여기 방법입니다 : http://msdn.microsoft.com/en-us/library/windows/desktop/aa385107(v=vs.85).aspx

여기를 설정하는 방법에 대한 예입니다 : http://social.msdn.microsoft.com/Forums/en-SG/csharpgeneral/thread/76a38eee-3ef6-4993-a54d-3fecc4eb6cff

+0

흠, 쿠키를 얻는 중입니다. http : // stackoverflow.co.kr/questions/650536/c-sharp-webrequest-using-webbrowser-cookie, 두 번째 대답, HttpWebRequest로 설정, 작동하지 않지만 계정이 로그인되지 않았습니다. – Jaanus

+0

HttpWebRequest의 CookieContainer? 이 컨테이너에는 http 요청을 수행 한 후 쿠키가 있어야합니다. – ThomasArdal

+0

아, 죄송합니다. 이미 문제를 해결 한 것을 보지 못했습니다. – ThomasArdal

관련 문제