android - Xamarin Android CookieManager 不存储所有 cookie
问题描述
我在我的 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”的那个没有出现的原因吗?
解决方案
经过几天和几天的寻找问题的答案。我终于找到了答案。我使用桌面 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;
});
上述解决方案的链接。在这里。
推荐阅读
- php - PHP var 声明最佳实践
- python - 如何使用字符串和“inf”值删除数据框中的某些单元格?
- excel - AABCCBAABCCBAA 序列的公式
- r - 使用保存的 h2o rulefit 模型进行预测会引发 NullPointerException 错误
- jquery - 如何在free-jqgrid中为行编辑/保存操作传递额外参数?
- c++ - 提升共享内存映射分配器错误
- kotlin - 创建类 kotlin 的实例
- reactjs - 测试运行没有错误,但操作不完整,在 React 项目上使用 cypress
- python - 是否可以在 SSHHook 气流中动态设置主机?
- ios - 页面视图外的 Flutter 可访问性标题语义