Xamarin .Net核心HttpClientHandler方法未实现(VS for Mac)
我在写一个.net核心(标准1.6)库,连接到我的WebAPI。该的WebAPI需要客户端证书。Xamarin .Net核心HttpClientHandler方法未实现(VS for Mac)
了.NET核心库的东西从Xamarin iOS应用被调用。
我不能为我的生活发送一个带有客户端证书头的HTTP请求。
我可以使用该库,并在windows计算机上使用来自Visual Studio 2017的客户端证书发布到API。
当我移动相同的项目为使用VS的Mac我Xamarin iOS应用程序我得到: “方法没有实现”设置SslProtocol或添加客户端证书时:
var handler = new HttpClientHandler();
handler.ClientCertificateOptions = ClientCertificateOption.Manual;
handler.SslProtocols = SslProtocols.Tls12;
handler.ClientCertificates.Add(new X509Certificate2(certificate));
相关库:
using System.Net;
using System.Net.Http;
using System.Security;
using System.Security.Cryptography.X509Certificates;
任何帮助将不胜感激。
好的,这花了我很长一段时间,但我能够发送客户端证书在Web请求中用于我们的服务器上的客户端身份验证。
首先,像Xamarin和.netCore一样令人敬畏,它们缺少很多方法.net开发人员习惯于。我是不是能够建立一个跨平台的要求,将在Android和iOS的工作,如HttpWebRequest的。
对于iOS,我创建了从继承的自定义类:NSUrlConnectionDataDelegate
然后我重写:
public override void WillSendRequestForAuthenticationChallenge(NSUrlConnection
connection, NSUrlAuthenticationChallenge challenge)
{
byte[] cert = System.IO.File.ReadAllBytes("clientCertificate.pfx");
NSUrlCredential credential = iSecurity.ImportPK12File(cert, "certPassword");
challenge.Sender.UseCredential(credential, challenge);
}
然后我创建了一个返回凭证类:
//cert is a byte array of a .pfx file included in the resource file
//iSecurity Custom class
NSUrlCredential credential = iSecurity.ImportPK12File(cert, "certpassword");
public static NSUrlCredential ImportPK12File(byte[] fileBytes, string passPhrase)
{
var cert = new X509Certificate2(fileBytes, passPhrase);
var options = NSDictionary.FromObjectAndKey(NSObject.FromObject(passPhrase), SecImportExport.Passphrase);
NSDictionary[] importStatus;
SecStatusCode statusCode = SecImportExport.ImportPkcs12(fileBytes, options, out importStatus);
if(statusCode != SecStatusCode.Success){
throw new Exception("Error importing certificate. ");
}
NSObject obj = importStatus[0]["trust"];
IntPtr secTrustRef = obj.Handle;
var identityHandle = importStatus[0][SecImportExport.Identity];
var identity = new SecIdentity(identityHandle.Handle);
var certificate = new SecCertificate(cert.GetRawCertData());
SecCertificate[] certificates = { certificate };
return NSUrlCredential.FromIdentityCertificatesPersistance(identity, certificates, NSUrlCredentialPersistence.ForSession);
}
您可能还可以重写此方法并发送vim的信任状: public override void ReceivedAuthenticationChallenge(NSUrlConnection connection,NSUrlAuthenticationChallenge challenge) base.ReceivedAuthenticationChallenge(connection,challenge); }
,我可能将其移动到那里,但以火这一关您创建类,从继承委托:NSUrlConnectionDataDelegate 并添加到您的连接。通过此连接发射的任何请求都覆盖的方法,并通过认证。
深挖后,虽然客户端证书可在突变进行设置,它不是在iOS上实现。 – Dys1