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 在浏览器中的显示方式。
请注意,在 postman 和 chrome 浏览器 中,这两个 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针对上面提到的解决方案。 .
我在我的 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 在浏览器中的显示方式。
请注意,在 postman 和 chrome 浏览器 中,这两个 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针对上面提到的解决方案。