2014-07-09 3 views
10

조직 용 OpenID Connect 사양을 구현하려고합니다. 필자는 프로토콜 의존성을 검증하기 위해 테스트 의존 어플리케이션에서 Microsoft의 OWIN 구현 인 OpenID Connect를 사용하고 있습니다.JWT 서명의 유효성을 검사 할 때 SecurityTokenSignatureKeyNotFoundException이 발생했습니다.

나는 다음과 같은 메타 데이터 문서 노출했습니다 신원 토큰이 JwtSecurityToken 클래스와 관련 핸들러를 사용하여 생성되는

{ 
    "keys": [ 
    { 
     "n": "xpXxl3M-YkZlzQJdArO1TfOGT2no-UL4dbZ7WuSCNIsSfyGDaqUXjMMHNyq9yD3vp-NCyk8kmn7d5XqHufnceXJM8q4xTrhN3lvywdBSbR-dwXsA-B-MJVgfiK0d_z-mxP9ew2Hj9-KkWbWCzsswlWp3gZ4mB4RGutB1IRSzXVIbvZ-MtKUb6XUDU4LDb_c1xCEXWZxhR-o1a1dLfObH2hHJ-w5y6odGlKtOFx4i4h0u7-Oj5R6k5b2YXEHM0IuYeN0u0sQvrTecokntGzPrvhnKy69I7Z_az5rC5kgloh25D9lTbe4vcRU7FXlYCFYDZsT0_IkGIXRi7brOS4f1ow", 
     "e": "AQAB", 
     "kty": "RSA", 
     "use": "sig", 
     "alg": "RS256", 
     "kid": "F8A59280B3D13777CC7541B3218480984F421450" 
    } 
    ] 
} 

:

{ 
    "issuer": "https://acs.contoso.com/", 
    "authorization_endpoint": "http://localhost:53615/oauth2/auth", 
    "token_endpoint": "http://localhost:53615/oauth2/token", 
    "userinfo_endpoint": "http://localhost:53615/connect/userinfo", 
    "jwks_uri": "http://localhost:53615/connect/keys", 
    "ui_locales_supported": [ 
    "en-GB" 
    ] 
} 

서명 키가이 문서로 노출을 X509SigningCredentials 클래스를 사용합니다. 이 코드는 응답 데이터의 매개 변수로서 토큰이 생성되고 호출 시스템에 반환되는 방식을 나타냅니다.

var credentials = new X509SigningCredentials(cert); // My certificate. 
var issuedTime = DateTime.UtcNow; 
var expiresTime = issuedTime.AddMinutes(5); 
var epoch = new DateTime(1970, 01, 01, 0, 0, 0); 

var claims = new[] 
{ 
    new Claim("sub", Guid.NewGuid().ToString()), 
    new Claim("iat" Math.Floor((issuedTime - epoch).TotalSeconds).ToString()), 
    new Claim("nonce", nonce), // Value from client 
} 

var token = new JwtSecurityToken(
    "https://acs.contoso.com", 
    client_id, // Value from client 
    claims, 
    new Lifetime(issuedTime, expiresTime), 
    credentials); 

var handler = new JwtSecurityTokenHandler(); 
parameters.Add("id_token", handler.WriteToken(token)); // Outgoing parameters. 

내가 신뢰 당사자 응용 프로그램에 토큰 다시 서명을 전달하려고

는 OWIN 미들웨어는 POST를 받아 토큰의 서명을 확인하려고 시도합니다. 이 과정에서 다음과 같은 예외가 발생합니다 :

SecurityTokenSignatureKeyNotFoundException : IDX10500 : 서명 유효성 검사가 실패했습니다. SecurityKeyIdentifier 해결되지 : 'SecurityKeyIdentifier (isReadOnly의 = 거짓, 카운트 = 1 조 [0] = X509ThumbprintKeyIdentifierClause (해시 = 0xF8A59280B3D13777CC7541B3218480984F421450))', 토큰 : "{"일반 ":"JWT ","ALG " { "iss": "https://test.accesscontrol.net/", "aud": "test", "nbf": 1404917162, "exp": 1404917462, "sub": "60eb55ec- 0699-4068-bfa6-41666fc2b2e9 ","IAT ":"1404917162 "} RAWDATA : eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ii1LV1NnTFBSTjNmTWRVR3pJWVNBbUU5Q0ZGQSJ9.eyJpc3MiOiJodHRwczovL2Fjcy5zdXJlY2xvdWQuY29tLyIsImF1ZCI6InRlc3QiLCJuYmYiOjE0MDQ5MTcxNjIsImV4cCI6MTQwNDkxNzQ2Miwic3ViIjoiNjBlYjU1ZWMtMDY5OS00MDY4LWJmYTYtNDE2NjZmYzJiMmU5IiwiaWF0IjoiMTQwNDkxNzE2MiJ9.xkP0RwlX3CYfU0KhFsVvLJC94WK22DTqNTm71cfjiJ8VUHv3b2YhDqfq70N8mQEyiR8vTR6OQqnO6UqXqX4RXUs6ZkfK 9Liv3n9NhCs97wJhP2jfefJYeScYtRmWcNNWSSL7vkm2JXQfwKOQTnOGp-ba04TtI6jVrjhOQXH43eCJ9vNuBUzdD-t8CAdmnbvH0nWpIB8kWbw5v8Sa0aQuxMjJYbLC_2Iw3X13dqnyVjp4fA7eSB8N7c1it0KEB-VKfUqiGD3VecyEZGGZbaGE8rvVet5QrY1lJ3V4yM8j6-xDc5Yndc4swOun0L3D6TYk-8gdVXUJDRjbv1ZuhZltsw '.

구성 요소는 여전히 시험판이므로 구현시 결함 일 수 있습니다. 그러나 모든 가능성이 배제 될 때까지 내 오류라고 가정하고 싶습니다.

분명히 잘못하고있는 일이 있습니까, 아니면 서명의 유효성을 검사하지 못하는 이유를 정확히 이해해야합니까?

답변

5

문제가 여기 예외 메시지에 자리한 :

조 [0] = X509ThumbprintKeyIdentifierClause (해시 = 0xF8A59280B3D13777CC7541B3218480984F421450) 토큰가 X에 대한 기본 키 식별자 절 서명

.509 인증서 : 엄지 손가락. 메타 데이터는 RSA 매개 변수와 이름 식별자 만 표시합니다. 클라이언트가 메타 데이터를 검색하면 X.509 지문이 아닌이 정보를 사용하여 RSA 키를 설정합니다.

var credentials = new X509CertificateCredentials(
    cert, 
    new SecurityKeyIdentifier(
     new NamedKeySecurityKeyIdentifierClause(
      "kid", 
      "F8A59280B3D13777CC7541B3218480984F421450"))); 

이 서명에 예상되는 식별자를 포함하고, 서명이 성공적으로 검증 :

이 오류를 해결하려면 서명 자격 증명이 올바른 이름 식별자를 포함하도록 변경해야합니다.

+1

당신이 말하는 인증서를 어디서 얻을 수 있습니까? –

+1

이것은 의미가 있지만 어디에서 인증서를 가져 왔습니까? –

+0

나는 튜토리얼을 따르고 있었고 임시 인증서'AddTemporarySigningCredential()'을 사용하고 있었기 때문에 웹 애플리케이션을 새로 고친 후에 작동한다. – Jaider

관련 문제