Xamarin Android CookieManager 不存储所有 cookie

Xamarin Android CookieManager doesn't store all cookies

我在我的 Xamarin 项目中使用 Android Web View 来执行第三方身份验证。登录成功后,我需要提取身份验证 cookie。我将这些 cookie 存储在持久存储中,然后使用它们传递给后续请求。 例如:

Android App >(opens) webview > Loads (idp provider) url > 用户提供凭据并且 saml 请求被发送到我的后端服务器 > 后端服务器验证 saml和 returns 身份验证 cookie。

它returns 两个饼干。

现在一切正常。在 webview 的 WebClient 的 OnPageFinished 方法中,我正在尝试使用该方法提取 cookie。

public override void OnPageFinished(WebView view, string url)
    {
        base.OnPageFinished(view, url);
        var handler = OnPageCompleted;
        var uri = new Uri(url);
        AllowCookies(view);
        var cookies = CookieManager.Instance.GetCookie(url);
        var onPageCompletedEventArgs = new OnPageCompletedEventArgs { Cookies = cookies, Url = uri.AbsolutePath, RelativeUrl = uri.PathAndQuery, Host = uri.Host };
        handler?.Invoke(this, onPageCompletedEventArgs);
    }
private void AllowCookies(WebView view)
    {
        CookieManager.Instance.Flush();
        CookieManager.AllowFileSchemeCookies();
        CookieManager.SetAcceptFileSchemeCookies(true);
        CookieManager.Instance.AcceptCookie();
        CookieManager.Instance.AcceptThirdPartyCookies(view);
        CookieManager.Instance.SetAcceptCookie(true);
        CookieManager.Instance.SetAcceptThirdPartyCookies(view, true);
    }

问题是,我只能得到一个 cookie(wc_cookie_ps_ck ), 我看不到其他身份验证 cookie(.AspNetCore.Cookies ). 以下是 cookie 在浏览器中的显示方式。

请注意,在 postmanchrome 浏览器 中,这两个 cookie 都会出现。 但是在 android webview 中,只有名称为“.AspNetCore.Cookies”的 cookie 根本没有出现。

根据 Java 文档,“When retrieving cookies from the cookie store, CookieManager also enforces the path-match rule from section 3.3.4 of RFC 2965 . So, a cookie must also have its “path” attribute set so that the path-match rule can be applied before the cookie is retrieved from the cookie store.” 由于我的两个 cookie 的路径不同,是不是路径设置为“/project”的那个没有出现的原因?

经过几天又一天的寻找问题的答案。我终于找到了答案。 我用桌面 chrome 对 webview 进行了远程调试,我发现我需要的所有 cookie 都存在于 webview 中。 然而方法,

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

没有 return 具有相同站点变量集的 cookie。 这看起来像是来自 Xamarin Android 的错误。我已经在 Xamarin Android github.

中提出了一个问题

在 xamarin android github 问题中我已经提到了重现的步骤。 对我来说,解决该问题的解决方法是在我的 asp.net 核心后端项目中关闭 samesite cookie varibale。 如下:

为了在使用 Identity 时配置应用程序 cookie,您可以在 Startup 的 ConfigureServices 中使用 ConfigureApplicationCookie 方法:

// add identity
services.AddIdentity<ApplicationUser, IdentityRole>();

// configure the application cookie
services.ConfigureApplicationCookie(options =>
{
    options.Cookie.SameSite = SameSiteMode.None;
});

Link针对上面提到的解决方案。 .