2013-02-24 36 views
7

Tôi đang tạo ứng dụng biểu mẫu cửa sổ, nơi tôi có một webbrowser control.Nhận cookie của trình duyệt web để đăng nhập

Sau khi người dùng đăng nhập vào với webbrowser, tôi muốn đăng nhập cũng với cùng một tài khoản với Microsoft.Http.HttpClient hoặc HttpWebRequest hoặc tương tự, nó phải là tương tự như cURL từ PHP.

Vấn đề là trang web chỉ cho phép đăng nhập một lần trên mỗi tài khoản và nếu tôi ký bằng HttpClient, trang web sẽ khởi động trình duyệt web.

Những gì tôi muốn biết, nếu nó có thể chiếm quyền điều khiển webbrowser phiên hoặc lấy cookies và sử dụng nó trong tôi HttpClient hoặc tương tự api.

Tôi có thể sử dụng webbrowser.Cookie để nhận một số dữ liệu, nhưng cách đẩy dữ liệu đến HttpClient?

Điều đó thậm chí có thể xảy ra không, tôi có thể lấy cookie và sử dụng cùng một phiên không? Nếu vậy, làm thế nào?

+0

Nếu cookie là cookie HttpOnly thì trình duyệt web sẽ không lưu trữ chúng. Xem [IEGetProtectedModeCookie] (https://msdn.microsoft.com/en-us/library/cc196998 (v = vs.85) .aspx) –

Trả lời

12

Got giúp đỡ từ đây:

Is it possible to transfer authentication from Webbrowser to WebRequest

Alkampfer posted giải pháp. Đây chính xác là những gì tôi cần và nó hoạt động.

Giải pháp này cũng mất Http only cookie.

Bạn có thể gọi phương thức GetUriCookieContainer trả về cho bạn một CookieContainer có thể được sử dụng cho cuộc gọi tiếp theo với đối tượng WebRequest.

[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

Tôi nghĩ bạn có thể đang kéo dài công nghệ một chút quá xa. Điều khiển webbrowser trong các cửa sổ biểu mẫu thường được thiết kế để cung cấp cho bạn hiển thị html cơ bản từ các tệp cục bộ hoặc internet, nhưng không nên sử dụng để thay thế trình duyệt web có đầy đủ thông tin.

Nếu bạn muốn xác thực với nhà cung cấp SSO, bạn phải sử dụng đúng thư viện, trong trường hợp này từ Windows Identitity Foundation, với Microsoft.IdentityModel, bạn sẽ nhận được cơ chế xác thực xác nhận quyền sở hữu. Cookie không thể được chia sẻ giữa các ứng dụng, trên thực tế, một số công nghệ web mới được thiết kế chỉ để tránh điều đó, vì vậy theo ý kiến ​​của tôi, hãy thử sử dụng WIF thay vì điều khiển trình duyệt web.

Hy vọng điều này sẽ giúp ích,

+1

Tôi không nghĩ đó là 'nhà cung cấp SSO', họ chỉ có một số điều javascript hoặc tương tự chặn hai kết nối với tài khoản trong cùng một thời điểm. – Jaanus

3

Bạn có thể, nhưng hơi phức tạp một chút. Sử dụng cuộc gọi InternetSetCookie cùng với CookieContainer từ HttpWebRequest.

Dưới đây là phương pháp: http://msdn.microsoft.com/en-us/library/windows/desktop/aa385107(v=vs.85).aspx

và đây là một ví dụ về cách thiết lập nó: http://social.msdn.microsoft.com/Forums/en-SG/csharpgeneral/thread/76a38eee-3ef6-4993-a54d-3fecc4eb6cff

+0

Hmm Tôi nhận được các cookie như thế này: http: // stackoverflow.com/questions/650536/c-sharp-webrequest-sử dụng-webbrowser-cookie, câu trả lời thứ hai ở đó và đặt thành HttpWebRequest, nhưng nó không hoạt động, tài khoản không được đăng nhập. – Jaanus

+0

Bạn đang thiết lập trường hợp của riêng bạn CookieContainer trên HttpWebRequest? Vùng chứa này sẽ chứa cookie sau khi thực hiện yêu cầu http. – ThomasArdal

+0

Ah xin lỗi đã không thấy rằng bạn đã giải quyết được vấn đề :) – ThomasArdal

Các vấn đề liên quan