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?
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? –
Điều này có ý nghĩa, nhưng bạn đã lấy chứng chỉ từ đâu? –
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