我在我的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在浏览器中的显示方式。
请注意,在postman和chrome 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没有出现的原因吗?
1条答案
按热度按时间px9o7tmv1#
经过一天又一天的寻找问题的答案。我终于找到了答案。我用桌面chrome对webview进行了远程调试,我发现我需要的所有cookie都存在于webview中。然而,方法,
不返回具有相同站点变量集的cookie。这看起来像是Xamarin Android的一个bug。我已经在Xamarin Android github.中提出了一个问题
在xamarin android github问题中,我已经提到了复制的步骤。对我来说,解决这个问题的方法是在我的www.example.com核心后端项目中设置相同的cookie变量asp.net。如下所示:
为了在使用Identity时配置应用程序Cookie,您可以在Startup的ConfigureServices中使用ConfigureApplicationCookie方法:
上述解决方案的链接. Here .