RS256 서명 JWT를 확인할 수 없습니다.

Nov 19 2020

KeyCloak과 함께 dotnet webapi에서 서명 된 JWT (RS256)를 구현하려고합니다. 앱 시작시 예상되는 응답 콘텐츠 (아래에 표시된 요청)와 함께 keycloak에 대한 openid 호출을 볼 수 있습니다.

여기에서 jwks_url 가져 오기

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

여기에서 열쇠를 받으세요

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

그런 다음 아래 요청으로 access_token을 얻습니다.

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

그런 다음 다음 끝점을 테스트합니다.

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

이 요청으로

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

하지만 난 항상 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"

서명 키 (세 번째 '청크')가 토큰에 존재합니다. 아래는 JWT 유효성 검사 코드입니다. 내가 뭔가를 놓치고 있습니까?

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,
            };
        });
}

답변

1 monty Nov 19 2020 at 02:32

JWT에 서명 (일명 세 번째 청크)이 있기 때문에 메시지를 해석합니다.

"The signature key was not found"

서명 확인에 문제가 있음을 확인합니다.

응답 / 접근성 재확인

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