Xamarin.Forms Image.Source with SSL

时间:2016-12-15 09:41:46

标签: image ssl xamarin xamarin.forms imagesource

我正在使用在线商店获取通过SSL保护的应用程序上传的用户图像。上传工作正常,因为我使用附带证书的WebClient。但是,当我尝试使用Xamarin.Forms.Image组件时,例如如果将来源设置为“https://blabla.com/upload/image123.jpg”,则无法在Android上加载图片。在iOS上,这是有效的,因为我有一个处理SSL连接的自定义NSUrlProtocol。

var image = new Image();

//will use ImageLoaderSourceHandler 
image.Source = "https://blabla.com/upload/image123.jpg";

对于WebClient,我将X509Certificate2(私钥和密码)附加到HttpWebRequest.ClientCertificates,它可以正常工作。但是我失去了如何将该证书提供给ImageLoaderSourceHandler背后的任何加载机制。

如何在Android上运行此功能?

3 个答案:

答案 0 :(得分:3)

所以我最终建立了自己的SecuredUriImageSource:

var image = new Image();

//will use SecuredImageLoaderSourceHandler  
image.Source = new SecuredUriImageSource ("https://blabla.com/upload/image123.jpg");

使用此自定义处理程序加载图像,而WebClientEx将实际证书附加到连接。

[assembly: ExportImageSourceHandler(typeof(SecuredUriImageSource), typeof(SecuredImageLoaderSourceHandler))]
namespace Helpers
{
    public class SecuredUriImageSource : ImageSource 
    {
        public readonly UriImageSource UriImageSource = new UriImageSource();

        public static SecuredUriImageSource FromSecureUri(Uri uri)
        {
            var source = new SecuredUriImageSource ();

            source.UriImageSource.Uri = uri;

            return source;
        }
    }

    public class SecuredImageLoaderSourceHandler : IImageSourceHandler
    {
        public async Task<Bitmap> LoadImageAsync(ImageSource imagesource, Android.Content.Context context, CancellationToken cancelationToken = default(CancellationToken))
        {
            var imageLoader = imagesource as SecuredUriImageSource;

            if (imageLoader != null && imageLoader.UriImageSource.Uri != null)
            {
                var webClient = new WebExtensions.WebClientEx();
                var data = await webClient.DownloadDataTaskAsync(imageLoader.UriImageSource.Uri, cancelationToken).ConfigureAwait(false);
                using (var stream = new MemoryStream(data) )
                    return await BitmapFactory.DecodeStreamAsync(stream).ConfigureAwait(false);
            }

            return null;
        }
    }
}

答案 1 :(得分:1)

我按照https://blog.xamarin.com/securing-web-requests-with-tls-1-2/中的设置操作,HTTPS源才开始加载。

编辑:

您可以打开&#34; Android项目&#34;的属性页面。 - &GT; &#34; Android选项&#34; - &GT; &#34;高级&#34;并选择HttpClient Implementation作为托管代码,并使用Native TLS 1.2+作为下一个选项

答案 2 :(得分:0)

我必须更新所有Xamarin.Android程序包才能正常工作