简体   繁体   中英

How do I access cookies in a Xamarin WebView?

In our Xamarin app, we need to allow our users to log in using their own SSO solution.

The way this works in our iOS app is that we open up a controller with a web view and point it at our site, and keep watching the cookies until they're back on our site with the cookie that indicates that they're logged in. But in Xamarin, I can't see how I can access the cookies for the WebView. Our Xamarin app is running on Windows 8.1 and WinPhone 8.1, but it will be extended to Android at some point so I need a cross-platform solution.

So, how do I access cookies in a Xamarin WebView?

You need to create a custom control in your PCL-Project and then add a custom webview for each platform. The platform secific implementation then gets the coockies and you can use it from your pcl-webview.

On Android you can get the cookies with following code:

var cookieHeader = CookieManager.Instance.GetCookie(url);

And on iOS:

NSHttpCookieStorage storage = NSHttpCookieStorage.SharedStorage;

Sourcecode on github: https://github.com/seansparkman/CookiesWebView

The great thing about Cookies in each of the mobile platforms is they are shared cookie containers across the app. The WebView doesn't hold the Cookie's the platform does and hence even HTTP calls and different WebView's can all access the same shared cookie container.

However they can be tricky to pull out of some platforms, in that reflection is needed. If your SSO solution only requires them going to webpages to sign on first, then they all share the same cookies anyway and you won't need to do any of this.

Android

Android has 2 separate cookie containers for HTTP and WebView's. Its the odd one out. Hence you have

    using System.Net.Http;

    private static CookieContainer _cookieContainer = new System.Net.CookieContainer();
    private static Android.Webkit.CookieManager _cookieManager = Android.Webkit.CookieManager.Instance;

With HTTP requests you do this

HttpClient client = new HttpClient(new HttpClientHandler() { CookieContainer = cookieContainer });

The WebView uses the other one and you can get and set cookies in each container.

iOS

This one is easy, they are all stored in

 NSHttpCookieStorage.SharedStorage.Cookies

WinRT

using Windows.Web.Http;  //NOT: Microsoft.Net.Http

var filter = new HttpBaseProtocolFilter();
HttpClient client = new HttpClient(filter);

// Use this, while it comes from an instance, its shared across everything.
filter.CookieManager

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM