Xamarin Android - 使用HttpClient和证书调用API

问题描述 投票:1回答:1

我们正在尝试与我们的API进行通信,该API在请求中需要证书,但它不能很好地工作。

通常我们只是通过在请求标头中传递一个SubscriptionKey来使用外部服务或Azure API Management API,但这次我们需要在AndroidHttpClientHandler中注入一个证书(.cer)但这个功能似乎不是支持,或者我们使用它错了?

你知道这种情况是否真的可能,如果是的话,我们应该如何实现呢?我尝试了很多东西,比如创建一个自定义的AndroidHttpClientHandler来允许在其中放入ClientCertificate但是没有成功

xamarin xamarin.android
1个回答
0
投票

最后设法让它工作:D对于那些感兴趣的人,这是我如何实现它:

TL; DR:升级到Visual Studio 2019和HttpWebRequest来救援(你可以在下面找到代码示例);-)

上下文:我们的项目由PCL和Android项目组成。在团队中,我们知道我们必须将PCL迁移到.NET Standard项目,但这需要时间,特别是当您有大量的库管理要求时(未更新到.NET Standard的库)xP

  • 当你想要调用API时,首先想到的是使用HttpClient / HttpRequestHandler对,我们只需要在HttpRequestHandler中传递我们的证书,如下所示: httpRequestHandler.ClientCertificates.Add(new X509Certificate2(..))

它为什么不起作用?因为我们正在开发使用引擎盖Mono.Droid的Xamarin.Android,因此我们遇到了不受欢迎的NotImplementedException()! WebRequestHandler怎么样?同样的命运:P

希望救赎来自HttpWebRequest如下:

        private Task<string> ExecuteRequest(Uri uri, X509Certificate2 certificate)
        {
            // Create a web request that points to our secured Backend API
            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri);

            if (certificate != null)
            {
                // Associate the certificates with the request
                request.ClientCertificates.Add(certificate);
            }

            // Launch the web request
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();

            // Output the stream to a jsonTextReader or anything else depending on your needs
            using (Stream stream = response.GetResponseStream())
            using (StreamReader sr = new StreamReader(stream))
            using (var jsonTextReader = new JsonTextReader(sr))
            {
                // Do whatever you want
            }
        }

这段代码在我的机器上工作(Visual Studio 2019),但不在我的同事(Visual Studio 2017)上:确实满足以下异常:

System.Security.Authentication.AuthenticationException:对SSPI的调用失败,请参阅内部异常。

我也在我的机器上安装了VS2017,所以我试图用它执行相同的代码,听起来很奇怪,我也得到了错误

Etvoilà:)当然,证书必须是“嵌入式资源”

© www.soinside.com 2019 - 2024. All rights reserved.