我在我的 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 在浏览器中的显示方式。
请注意,在 postman 和 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 核心后端项目中设置 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;
});
上述解决方案的链接。 这里.
我如何读取 AWS Cognito cookie??