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; 

任何帮助将不胜感激。

+0

深挖后,虽然客户端证书可在突变进行设置,它不是在iOS上实现。 – Dys1

好的,这花了我很长一段时间,但我能够发送客户端证书在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 并添加到您的连接。通过此连接发射的任何请求都覆盖的方法,并通过认证。