安全的pdf文件和Xamarin表单

时间:2017-03-30 19:45:05

标签: pdf webview xamarin.forms

我有一个需要身份验证的表单应用。我的一个页面是webview,我使用cookie通过webview将身份验证状态发送到服务器。在网页上是指向.pdf文件的链接,该文件也需要身份验证。点击此链接后,我抓住网址并尝试使用Device.OpenUri打开它,但身份验证失败。有没有办法将身份验证cookie和网址发送到OpenUri,或者让设备的浏览器知道用户已通过身份验证的其他方式?或者是否有其他方法可以在webview中下载pdf文件?

1 个答案:

答案 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);
}

我在Cookie Sharing with WebView and the Http Client中详细介绍。