-
Notifications
You must be signed in to change notification settings - Fork 588
JWT Signature validation fails in .NET Core app targetting .NET Framework 4.7.1 #1649
Description
Hi,
I was having an issue trying to authenticate users to a .NET Core WebAPI using a JWT bearer token generated by a WSO2 Identity Server.
The project targets .NET Framework 4.7.1 and references Microsoft.AspNetCore.Authentication.JwtBearerToken.
At first, I thought it was an issue related to my WSO2 IS configuration.
Then, I found this article:
https://www.jerriepelser.com/blog/manually-validating-rs256-jwt-dotnet/
and tried to execute the same code found there in a new .NET Core Console app: it worked!
So, I thought: "it maybe an issue of my WebAPI project".
I then made a few tries with two different brand new .NET Core WebAPI projects, one targetting .NET Core 2.0 and the other one targetting .NET Framework 4.7.1, using the same startup code in both.
Here is the code:
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
IConfigurationManager<OpenIdConnectConfiguration> configurationManager = new ConfigurationManager<OpenIdConnectConfiguration>($"{Configuration["OpenId:Authority"]}/.well-known/openid-configuration", new OpenIdConnectConfigurationRetriever());
OpenIdConnectConfiguration openIdConfig = configurationManager.GetConfigurationAsync(CancellationToken.None).Result;
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.IncludeErrorDetails = true;
options.TokenValidationParameters.ValidateIssuer = true;
options.TokenValidationParameters.ValidateAudience = true;
options.TokenValidationParameters.ValidateIssuerSigningKey = true;
options.TokenValidationParameters.ValidIssuer = Configuration["OpenId:Issuer"];
options.TokenValidationParameters.ValidAudiences = new[] { Configuration["OpenId:Audience"] };
options.TokenValidationParameters.IssuerSigningKeys = openIdConfig.SigningKeys;
});
services.AddMvc();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseAuthentication();
app.UseMvc();
}
I decorated the default ValuesController with the Authorize attribute and tried to invoke it via Postman, with a new JWT token obtained from the WSO2 IS.
The results are different:
- the app targetting .NET Core 2.0 simply works, giving me the expected JSON result from the Action invoked
- the one targetting .NET Framework 4.7.1 replies with Bearer error="invalid_token", error_description="The signature is invalid"
So the question is:
is this the expected behavior or is it a bug?
Thanks in advance.