Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How are people authenticated in their ASP.NET Core Web APIs on Ubuntu/Docker given the bug described below?

I have come across what I think is a bug preventing me from loading an X509Certificate2 on Ubuntu or the Debian-based docker image provided by Microsoft. This means that I can't initialise JwtAuthentication in my web API on these platforms, and I'm looking for help:

  1. Are you successfully using JwtAuthentication on Linux?
  2. If so, how are you initialising an X509Certificate for the JwtBearerOptions?
  3. Can you see a problem with what I'm doing, or suggest a work-around or solution?

I have logged the issue with the corefx team and you can see the full discussion here, but below is the main description of the problem:


I have a Web API running in a docker container. The container is built from the provided 1.1.0 package:

  FROM microsoft/aspnetcore:1.1.0

and the Web API binaries are copied in. The API runs fine and returns data as expected until I turn on authentication, at which point it needs an X509SecurityKey to set the TokenValidationParameters.IssuerSigningKey value. It throws an exception when it attempts to initialise an X509Certificate2 from a string value:

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

throws an 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()

The string value from which the X509Certificate2 is being initialised is:

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

The same code runs with no problem on Windows, building a certificate from the same string.

Edit: Note that while I initially encountered this problem running a docker image, subsequent testing has shown that it also occurs using Ubuntu 14.04 + .NET Core 1.1

like image 319
Peter Avatar asked Feb 15 '17 15:02

Peter


People also ask

What is authenticateresult in ASP NET Core?

That return value signals ASP.NET Core’s authentication middleware that the request is authentic. Otherwise, it returns AuthenticateResult.Fail, which prompts ASP.NET Core to halt the request and return a 401.

How to check if a user is authenticated in web API?

Web API provides a built-in authorization filter, AuthorizeAttribute. This filter checks whether the user is authenticated. If not, it returns HTTP status code 401 (Unauthorized), without invoking the action.

How do I use IIS authentication in web API?

Authentication Web API assumes that authentication happens in the host. For web-hosting, the host is IIS, which uses HTTP modules for authentication. You can configure your project to use any of the authentication modules built in to IIS or ASP.NET, or write your own HTTP module to perform custom authentication.

What is ASP NET Core API?

ASP.NET Core API is a Cross-Platform Open Source framework for developing a model, high performance, cloud-enabled internet-connected apps. Web API is nothing but an Application Programming Interface for developing the Web Server or Application.


1 Answers

The problem here is that what is being passed to the constructor are the bytes of the base64 representation of the key, and not the bytes of the key itself.

If this code works on Windows then maybe it's a good idea to create an issue in the .net core github referencing this problem.

like image 59
Salem Avatar answered Sep 25 '22 06:09

Salem