2

在我们的 Xamarin 应用程序中,我们需要允许我们的用户使用他们自己的 SSO 解决方案登录。

这在我们的 iOS 应用程序中的工作方式是,我们打开一个带有 web 视图的控制器并将其指向我们的站点,并继续观察 cookie,直到它们返回我们的站点,cookie 表明它们已登录. 但是在 Xamarin 中,我看不到如何访问 WebView 的 cookie。我们的 Xamarin 应用程序在 Windows 8.1 和 WinPhone 8.1 上运行,但它会在某个时候扩展到 Android,所以我需要一个跨平台的解决方案。

那么,如何在 Xamarin WebView 中访问 c​​ookie?

4

2 回答 2

4

您需要在 PCL 项目中创建自定义控件,然后为每个平台添加自定义 web 视图。然后平台特定的实现会获取 coockies,您可以从您的 pcl-webview 中使用它。

在 Android 上,您可以使用以下代码获取 cookie:

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

在 iOS 上:

NSHttpCookieStorage storage = NSHttpCookieStorage.SharedStorage;

github上的源代码:https ://github.com/seansparkman/CookiesWebView

于 2016-08-11T09:30:20.893 回答
2

每个移动平台中 Cookie 的优点在于它们是跨应用程序共享的 cookie 容器。WebView 不保存平台所保存的 Cookie,因此即使是 HTTP 调用和不同的 WebView 都可以访问相同的共享 cookie 容器。

然而,它们可能很难从某些平台中退出,因为需要反思。如果您的 SSO 解决方案只要求他们先访问网页进行登录,那么无论如何他们都共享相同的 cookie,您无需执行任何操作。

安卓

Android 有 2 个用于 HTTP 和 WebView 的独立 cookie 容器。它是奇怪的一个。因此你有

    using System.Net.Http;

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

使用 HTTP 请求,您可以这样做

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

WebView 使用另一个,您可以在每个容器中获取和设置 cookie。

iOS

这一个很简单,它们都存储在

 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
于 2016-08-11T13:44:04.337 回答