鉴于下面描述的错误,人们如何在Ubuntu / Docker的ASP.NET Core Web API中进行身份validation?

我遇到了我认为是一个错误,阻止我加载Ubuntu上的X509Certificate2或Microsoft提供的基于Debian的Docker镜像。 这意味着我无法在这些平台上的Web API中初始化JwtAuthentication,并且正在寻求帮助:

  1. 你在Linux上成功使用JwtAuthentication吗?
  2. 如果是这样,你如何初始化JwtBearerOptions的X509Certificate?
  3. 你能看到我正在做什么的问题,或者提出一个解决方法吗?

我已经用corefx团队logging了这个问题,你可以在这里看到完整的讨论,但是下面是这个问题的主要描述:


我有一个在Docker容器中运行的Web API。 该容器是由提供的1.1.0包构build的:

FROM microsoft/aspnetcore:1.1.0 

并且Web API二进制文件被复制进来。API运行正常并按预期返回数据,直到我打开authentication,此时它需要一个X509SecurityKey来设置TokenValidationParameters.IssuerSigningKey值。 它尝试从string值初始化X509Certificate2时引发exception:

  string certValue = certificate.Value; byte[] byteCert = Encoding.ASCII.GetBytes(certValue); return new X509Certificate2(byteCert); 

抛出一个OpenSslCryptographicException:

  Unhandled Exception: System.Exception: Failed to extract the Token Signing certificate from the Federation metadata. ---> Interop+Crypto+OpenSslCryptographicException: error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error at Internal.Cryptography.Pal.CertificatePal.FromBlob(Byte[] rawData, String password, X509KeyStorageFlags keyStorageFlags) at System.Security.Cryptography.X509Certificates.X509Certificate..ctor(Byte[] data) at Mercury.Shared.Rest.Authentication.AdfsFederationMetadata.GetSigningCertificate() 

正在初始化X509Certificate2的string值是:

  MIIC4jCCAcqgAwIBAgIQHWt3kGySgJxPtsalC0EoKzANBgkqhkiG9w0BAQsFADAtMSswKQYDVQQDEyJBREZTIFNpZ25pbmcgLSBzdHMuYWxsYW5ncmF5LmNvLnphMB4XDTE2MDkwNzA5MDQyM1oXDTE3MDkwNzA5MDQyM1owLTErMCkGA1UEAxMiQURGUyBTaWduaW5nIC0gc3RzLmFsbGFuZ3JheS5jby56YTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANdq9BEuBRPsTdpngeFyXbfH5lBg5WyENQW0qz2FtDw3AvZhiPdFyvTPZIeZDc4vhg+gPuG8pCxhFa6hPqNIwnLSVuyhUi4/CtZrLghF2wVVcyriijvirzdVp2m56nO31NB5HXbSerTmey1gJsgumr+MiaM2CEI9z5ctwAp66jqM9jVv7kzqIwB33irSck+X97jUa9XVa0/0QPBdrSVUR0i4rmfZ9orRdTKC3IA13bD9duk2Kc9V7t8t/woo80Kbbb3ZseYk5N8AI+7RRw9+oSAm8zZQzBYkNkAMeI1mto1faXsm9Aea4HXbyCbvVOx/JGj5Ki7YK/BtzWAyCgRu0TkCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAd9rdJ1V9te8njMHiEuvr1DLVUBt2YdpZ8qGFC2rWDKeEW8iARrMfbtrlQovvE1radxoZ2gWR1AaaoEqzmLvF9fEAZ7xjR2P2UlT+ZgntfMn/c+3j7gWnfGNHIjosaYiyF72q4k6bgOx1TV8X08kD2AMBH27utXeeUQTZTd0bUWaWpr76NrDB95k4P6d0t5bkYsguiQjV+2t5/dSvrbTPVbXQmWGyC53IS2OI37AI2bIaeCCDkRHDoxu+L/DtgH8N60k2CLfa+pf0/cxQCR39p4Z+tquVKfYgJIsdZLD6bbrqK9VdpSR2vyUcDLMTGnO0tuDuzBd/xdhJ0GKbnBv3+g== 

在Windows上运行相同的代码没有问题,从相同的string构build证书。

编辑: 请注意,虽然我最初遇到这个问题运行docker的形象,后续testing表明,它也发生在使用Ubuntu 14.04 + .NET Core 1.1

这里的问题是传递给构造函数的是密钥的base64表示的字节,而不是密钥本身的字节。

如果这个代码在Windows上工作,那么在.net core github中引用这个问题可能是一个好主意。