我们正在尝试与我们的API进行通信,该API在请求中需要证书,但它不能很好地工作。
通常我们只是通过在请求标头中传递一个SubscriptionKey来使用外部服务或Azure API Management API,但这次我们需要在AndroidHttpClientHandler中注入一个证书(.cer)但这个功能似乎不是支持,或者我们使用它错了?
你知道这种情况是否真的可能,如果是的话,我们应该如何实现呢?我尝试了很多东西,比如创建一个自定义的AndroidHttpClientHandler来允许在其中放入ClientCertificate但是没有成功
最后设法让它工作:D对于那些感兴趣的人,这是我如何实现它:
TL; DR:升级到Visual Studio 2019和HttpWebRequest来救援(你可以在下面找到代码示例);-)
上下文:我们的项目由PCL和Android项目组成。在团队中,我们知道我们必须将PCL迁移到.NET Standard项目,但这需要时间,特别是当您有大量的库管理要求时(未更新到.NET Standard的库)xP
它为什么不起作用?因为我们正在开发使用引擎盖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à:)当然,证书必须是“嵌入式资源”