Xamarin Android CookieManager不存储所有Cookie

332nm8kg  于 2023-04-09  发布在  Android
关注(0)|答案(1)|浏览(124)

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

Android App〉(打开)webview〉Loads(idp provider)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在浏览器中的显示方式。

请注意,在postmanchrome browser中,两个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”的cookie没有出现的原因吗?

px9o7tmv

px9o7tmv1#

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

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

不返回具有相同站点变量集的cookie。这看起来像是Xamarin Android的一个bug。我已经在Xamarin Android github.中提出了一个问题
在xamarin android github问题中,我已经提到了复制的步骤。对我来说,解决这个问题的方法是在我的www.example.com核心后端项目中设置相同的cookie变量asp.net。如下所示:
为了在使用Identity时配置应用程序Cookie,您可以在Startup的ConfigureServices中使用ConfigureApplicationCookie方法:

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

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

上述解决方案的链接. Here .

相关问题