我有一个需要身份验证的表单应用。我的一个页面是webview,我使用cookie通过webview将身份验证状态发送到服务器。在网页上是指向.pdf文件的链接,该文件也需要身份验证。点击此链接后,我抓住网址并尝试使用Device.OpenUri打开它,但身份验证失败。有没有办法将身份验证cookie和网址发送到OpenUri,或者让设备的浏览器知道用户已通过身份验证的其他方式?或者是否有其他方法可以在webview中下载pdf文件?
答案 0 :(得分:4)
因为Device.OpenUri只会用url打开另一个应用程序,所以无法通过身份验证。您需要做的是将PDF下载到本地存储,然后从本地存储打开PDF。您需要将文件放在移动设备的共享存储中,以允许其他应用程序访问它。
如果存在安全风险,则需要在应用中添加内部PDF查看器,以便在内部查看应用中的PDF。
现在,如果要下载PDF,则需要使用HttpClient。在iOS和UWP中,HttpClient和WebView共享相同的cookie容器,这意味着如果您在WebView上进行身份验证,它将已在HttpClient中进行身份验证。对于Android,您需要复制身份验证Cookie。
首先建立一个可以阅读的cookie容器。
CookieContainer _cookieContainer = new CookieContainer();
System.Net.Http.HttpClient _client = new System.Net.Http.HttpClient(new HttpClientHandler() { CookieContainer = _cookieContainer });
然后,根据您要复制的方式,您可以
private void CopyCookies(HttpResponseMessage result, Uri uri)
{
foreach (var header in result.Headers)
if (header.Key.ToLower() == "set-cookie")
foreach (var value in header.Value)
_cookieManager.SetCookie($"{uri.Scheme}://{uri.Host}", value);
foreach (var cookie in GetAllCookies(_cookieContainer))
_cookieManager.SetCookie(cookie.Domain, cookie.ToString());
}
或
public void ReverseCopyCookies(Uri uri)
{
var cookie = _cookieManager.GetCookie($"{uri.Scheme}://{uri.Host}");
if (!string.IsNullOrEmpty(cookie))
_cookieContainer.SetCookies(new Uri($"{uri.Scheme}://{uri.Host}"), cookie);
}