RS256-signiertes JWT kann nicht validiert werden
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
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