2

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

Android App >(打开)webview > 加载(idp 提供者)url > 用户提供凭据并将 saml 请求发送到我的后端服务器 > 后端服务器验证 saml 并返回身份验证 cookie。

它返回两个 cookie。

现在一切正常。在 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 在浏览器中的显示方式。

在此处输入图像描述

请注意,在邮递员chrome 浏览器中,cookie 都会出现。但在 android webview 中,只有名称为“.AspNetCore.Cookies”的 cookie 根本没有出现。

根据 Java 文档,“当从 cookie 存储中检索 cookie 时,CookieManager 还强制执行 RFC 2965 的第 3.3.4 节中的路径匹配规则。因此,cookie 还必须设置其“路径”属性,以便路径匹配可以在从 cookie 存储中检索 cookie 之前应用规则。 ” 由于我的两个 cookie 具有不同的路径,是路径设置为“/project”的那个没有出现的原因吗?

4

1 回答 1

2

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

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

不返回具有相同站点变量集的 cookie。这看起来像是来自 Xamarin Android 的错误。我已经在Xamarin Android github 中提出了一个问题。

在 xamarin android github 问题中,我提到了重现的步骤。对我来说,解决该问题的解决方法是在我的 asp.net 核心后端项目中设置相同的站点 cookie 变量。如下:

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

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

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

上述解决方案的链接。在这里

于 2018-10-12T06:21:19.563 回答