RS256-signiertes JWT kann nicht validiert werden

Nov 19 2020

Ich versuche, signiertes JWT (RS256) zusammen mit KeyCloak auf einem Dotnet-Webapi zu implementieren. Beim Start der App kann ich sehen, dass die OpenID-Aufrufe an Keycloak mit dem erwarteten Antwortinhalt getätigt werden (Anforderungen siehe unten).

Holen Sie sich die jwks_url hier

GET https://localhost:8080/auth/realms/core/.well-known/openid-configuration

Holen Sie sich die Schlüssel von hier

GET https://localhost:8080/auth/realms/core/protocol/openid-connect/certs

Ich bekomme dann ein access_token mit der Anfrage unten

POST https://localhost:8080/auth/realms/core/protocol/openid-connect/token
Content-Type: application/x-www-form-urlencoded

grant_type=password&client_id=admin-cli&username=jim&password=foobar

Ich teste dann den folgenden Endpunkt

[ApiController]
[Route("/")]
public class AppController : ControllerBase
{
    [Authorize]
    [HttpGet]
    public OkObjectResult Get()
    {
        return Ok("This is the secured page");
    }
}

mit dieser Anfrage

GET https://localhost:5001
Authorization: Bearer MY_TOKEN 

Aber ich bekomme immer eine 401

HTTP/1.1 401 Unauthorized
Content-Length: 0
Date: Wed, 18 Nov 2020 17:41:28 GMT
Server: Kestrel
Www-Authenticate: Bearer error="invalid_token", error_description="The signature key was not found"

Der Signaturschlüssel (dritter 'Block') ist im Token vorhanden. Unten finden Sie den JWT-Validierungscode. Vermisse ich etwas

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();

    var audience = Configuration["Jwt:Audience"];
    var issuer = Configuration["Jwt:Issuer"];
    bool.TryParse(Configuration["Jwt:RequireHttpsMetadata"], out var requireHttpsMetadata);

    IConfigurationManager<OpenIdConnectConfiguration> configurationManager =
        new ConfigurationManager<OpenIdConnectConfiguration>(
            $"{Configuration["Jwt:Authority"]}/auth/realms/core/.well-known/openid-configuration",
            new OpenIdConnectConfigurationRetriever());
    var openIdConfig =
        configurationManager.GetConfigurationAsync(CancellationToken.None).Result;

    services.AddAuthentication(options =>
        {
            options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
        })
        .AddJwtBearer(options =>
        {
            options.SaveToken = true;
            options.RequireHttpsMetadata = requireHttpsMetadata;
            options.TokenValidationParameters.IssuerSigningKeys = openIdConfig.SigningKeys;
            options.TokenValidationParameters = new TokenValidationParameters
            {
                ValidateIssuer = true,
                ValidateAudience = true,
                ValidateLifetime = true,

                ValidIssuer = issuer,
                ValidAudience = audience,
                ValidateIssuerSigningKey = true,
            };
        });
}

Antworten

1 monty Nov 19 2020 at 02:32

Da die JWT eine Signatur (auch bekannt als dritter Block) enthält, würde ich die Nachricht interpretieren

"The signature key was not found"

dass es ein Problem mit der Validierung der Signatur gibt.

Überprüfen Sie die Antworten / Zugänglichkeit von

GET https://localhost:8080/auth/realms/core/protocol/openid-connect/certs