Я пытаюсь реализовать спецификацию OpenID Connect для моей организации. Я использую Microsoft OWIN для реализации OpenID Connect в тестовом приложении проверяющей стороны, чтобы проверить мою реализацию протокола.
Я выставил следующий документ метаданных:
{
"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"
]
}
Ключ подписи представлен как этот документ:
{
"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"
}
]
}
Идентификационный токен создается с использованием класса JwtSecurityToken
и связанного с ним обработчика с использованием класса 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 = False, Count = 1, Clause [0] = X509ThumbprintKeyIdentifierClause (Hash = 0xF8A59280B3D13777CC7541B3218480984F421450)), ": токен" "":: " "x5t": "-KWSgLPRN3fMdUGzIYSAmE9CFFA"}. {"iss": " https://test.accesscontrol.net/ ", "aud": "test", "nbf": 1404917162, "exp": 1404917462, " суб ":" 60eb55ec-0699-4068-bfa6-41666fc2b2e9", "IAT": "1404917162"} RAWDATA: eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ii1LV1NnTFBSTjNmTWRVR3pJWVNBbUU5Q0ZGQSJ9.eyJpc3MiOiJodHRwczovL2Fjcy5zdXJlY2xvdWQuY29tLyIsImF1ZCI6InRlc3QiLCJuYmYiOjE0MDQ5MTcxNjIsImV4cCI6MTQwNDkxNzQ2Miwic3ViIjoiNjBlYjU1ZWMtMDY5OS00MDY4LWJmYTYtNDE2NjZmYzJiMmU5IiwiaWF0IjoiMTQwNDkxNzE2MiJ9.xkP0RwlX3CYfU0KhFsVvLJC94WK22DTqNTm71cfjiJ8VUHv3b2YhDqfq70N8mQEyiR8vTR6OQqnO6UqXqX4RXUs6ZkfK9Liv3n9NhCs97wJhP2jfefJYeScYtRmWcNNWSSL7vkm2JXQfwKOQTnOGp-ba04TtI6jVrjhOQXH43eCJ9vNuBUzdD-t8CAdmnbvH0nWpIB8kWbw5v8Sa0aQuxMjJYbLC_2Iw3X13dqnyVjp4fA7eSB8N7c1it0KEB-VKfUqiGD3VecyEZGGZbaGE8rvVet5QrY1lJ3V4yM8j6-xDc5Yn dc4swOun0L3D6TYk-8gdVXUJDRjbv1ZuhZltsw.
Компонент все еще является предварительным выпуском, так что это может быть недостатком в реализации, однако я хочу предположить, что это моя ошибка, пока все возможности не будут исключены.
Есть ли что-то, что я делаю, что явно не так, или я должен что-то сделать, чтобы точно понять, почему подпись не проходит проверку?