2014-07-09 32 views
10

Tôi đang cố triển khai đặc tả OpenID Connect cho tổ chức của mình. Tôi đang sử dụng việc thực hiện OWIN của OWIN của Microsoft trong một ứng dụng kiểm thử dựa vào bên để xác minh việc triển khai giao thức của tôi.SecurityTokenSignatureKeyNotFoundException khi xác thực chữ ký JWT

Tôi đã tiếp xúc với các tài liệu siêu dữ liệu sau:

{ 
    "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" 
    ] 
} 

Mấu chốt ký được tiếp xúc như tài liệu này:

{ 
    "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" 
    } 
    ] 
} 

Các dấu hiệu nhận diện được tạo ra bằng cách sử dụng lớp JwtSecurityToken và xử lý liên quan , sử dụng lớp X509SigningCredentials. Mã này đại diện cho cách mã thông báo được xây dựng và trả về hệ thống gọi điện thoại như một tham số của dữ liệu phản hồi.

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. 

Khi tôi cố gắng chuyển mã thông báo đã ký trở lại ứng dụng bên, thì phần mềm trung gian OWIN chấp nhận POST và cố gắng xác minh chữ ký của mã thông báo. Khi làm như vậy, ngoại lệ sau được ném:

SecurityTokenSignatureKeyNotFoundException: IDX10500: Chữ ký xác thực không thành công. Không thể giải quyết SecurityKeyIdentifier: 'SecurityKeyIdentifier (IsReadOnly = False, Count = 1, khoản [0] = X509ThumbprintKeyIdentifierClause (Hash = 0xF8A59280B3D13777CC7541B3218480984F421450))', mã thông báo: '{ "typ": "JWT", "alg": "RS256", "x5t": "- KWSgLPRN3fMdUGzIYSAmE9CFFA"}. {"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'.

Thành phần vẫn chưa được phát hành trước, vì vậy đây có thể là lỗi trong quá trình triển khai, tuy nhiên tôi muốn giả định đó là lỗi của tôi cho đến khi tất cả các khả năng bị loại trừ.

Có điều gì tôi đang làm rõ ràng là sai, hay có điều gì tôi nên làm để hiểu chính xác tại sao chữ ký không được xác nhận?

Trả lời

5

Vấn đề là nép mình trong thông điệp ngoại lệ ở đây:

khoản [0] = X509ThumbprintKeyIdentifierClause (Hash = 0xF8A59280B3D13777CC7541B3218480984F421450)

Các token được ký hợp đồng với các điều khoản định danh chủ chốt mặc định cho một X .509 giấy chứng nhận: dấu vân tay của nó. Siêu dữ liệu chỉ hiển thị thông số RSA và số nhận dạng tên. Khi khách hàng truy xuất siêu dữ liệu, nó sẽ thiết lập khóa RSA bằng thông tin này, chứ không phải dấu vân tay X.509.

Để sửa lỗi này, các chứng chỉ ký phải được thay đổi để bao gồm tên định danh chính xác:

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

này bao gồm việc nhận dạng dự kiến ​​trong chữ ký, và chữ ký được xác nhận thành công.

+1

Vui lòng cho tôi biết nơi tôi nhận được chứng chỉ mà bạn đang đề cập đến? –

+1

Điều này có ý nghĩa, nhưng bạn đã lấy chứng chỉ từ đâu? –

+0

Tôi đã làm theo một hướng dẫn, và tôi đã sử dụng chứng chỉ tạm thời 'AddTemporarySigningCredential()', vì vậy sau khi làm mới ứng dụng web, nó hoạt động. – Jaider

Các vấn đề liên quan