2014-07-09 12 views
10

मान्य करते समय सुरक्षा टोकन हस्ताक्षर KeyNotFoundException मैं अपने संगठन के लिए ओपनआईडी कनेक्ट विनिर्देश को लागू करने की कोशिश कर रहा हूं। मैं प्रोटोकॉल के कार्यान्वयन को सत्यापित करने के लिए एक परीक्षण भरोसेमंद पार्टी अनुप्रयोग में ओपनआईडी कनेक्ट के माइक्रोसॉफ्ट के ओविन इनपुट कार्यान्वयन का उपयोग कर रहा हूं।जेडटीटी हस्ताक्षर

मैं निम्नलिखित मेटाडाटा दस्तावेज़ उजागर किया है:

{ 
    "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 वर्ग और उसके संबंधित हैंडलर का उपयोग कर बनाई जा रही है:

{ 
    "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 मिडलवेयर पोस्ट स्वीकार करता है और टोकन के हस्ताक्षर सत्यापित करने के प्रयास करता है। ऐसा करने में, निम्न अपवाद फेंक दिया जाता है:

SecurityTokenSignatureKeyNotFoundException: IDX10500: हस्ताक्षर सत्यापन विफल। SecurityKeyIdentifier को हल करने में असमर्थ: 'SecurityKeyIdentifier (IsReadOnly = झूठी, गणना = 1, खण्ड [0] = X509ThumbprintKeyIdentifierClause (हैश = 0xF8A59280B3D13777CC7541B3218480984F421450))', टोकन: '{ "typ": "जेडब्ल्यूटी", "alg": "आरएस 256", "x5t": "- KWSgLPRN3fMdUGzIYSAmE9CFFA"}। {"जारी करें": "https://test.accesscontrol.net/", "ऑड": "टेस्ट", "एनबीएफ": 1404917162, "एक्सपी": 1404917462, "सब": "60eb55ec- 0699-4068-bfa6-41666fc2b2e9 "," आई ए टी ":" +१४०४९१७१६२ "} RawData: eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ii1LV1NnTFBSTjNmTWRVR3pJWVNBbUU5Q0ZGQSJ9.eyJpc3MiOiJodHRwczovL2Fjcy5zdXJlY2xvdWQuY29tLyIsImF1ZCI6InRlc3QiLCJuYmYiOjE0MDQ5MTcxNjIsImV4cCI6MTQwNDkxNzQ2Miwic3ViIjoiNjBlYjU1ZWMtMDY5OS00MDY4LWJmYTYtNDE2NjZmYzJiMmU5IiwiaWF0IjoiMTQwNDkxNzE2MiJ9.xkP0RwlX3CYfU0KhFsVvLJC94WK22DTqNTm71cfjiJ8VUHv3b2YhDqfq70N8mQEyiR8vTR6OQqnO6UqXqX4RXUs6ZkfK 9Liv3n9NhCs97wJhP2jfefJYeScYtRmWcNNWSSL7vkm2JXQfwKOQTnOGp-ba04TtI6jVrjhOQXH43eCJ9vNuBUzdD-t8CAdmnbvH0nWpIB8kWbw5v8Sa0aQuxMjJYbLC_2Iw3X13dqnyVjp4fA7eSB8N7c1it0KEB-VKfUqiGD3VecyEZGGZbaGE8rvVet5QrY1lJ3V4yM8j6-xDc5Yndc4swOun0L3D6TYk-8gdVXUJDRjbv1ZuhZltsw '।

घटक अभी भी पूर्व-रिलीज है, इसलिए यह कार्यान्वयन में एक दोष हो सकता है, हालांकि मैं मानना ​​चाहता हूं कि यह मेरी त्रुटि है जब तक कि सभी संभावनाओं का उल्लंघन नहीं हो जाता है।

क्या ऐसा कुछ भी है जो मैं कर रहा हूं जो स्पष्ट रूप से गलत है, या क्या मुझे यह समझने के लिए कुछ करना चाहिए कि हस्ताक्षर मान्य होने में विफल क्यों हो रहा है?

उत्तर

5

समस्या यहाँ अपवाद संदेश में बसा हुआ है:

खण्ड [0] = X509ThumbprintKeyIdentifierClause (हैश = 0xF8A59280B3D13777CC7541B3218480984F421450)

टोकन एक एक्स के लिए डिफ़ॉल्ट कुंजी पहचानकर्ता खंड के साथ हस्ताक्षरित किया गया है .50 9 प्रमाणपत्र: इसका थंबप्रिंट। मेटाडेटा केवल आरएसए पैरामीटर और एक नाम पहचानकर्ता को उजागर कर रहा है। जब ग्राहक मेटाडेटा पुनर्प्राप्त करता है, तो यह इस जानकारी का उपयोग करके एक आरएसए कुंजी सेट करता है, न कि X.50 9 थंबप्रिंट।

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

यह हस्ताक्षर में की उम्मीद पहचानकर्ता शामिल, और हस्ताक्षर सफलतापूर्वक मान्य है:

इस त्रुटि को ठीक करने के लिए, पर हस्ताक्षर करने प्रमाणिकता सही नाम पहचानकर्ता शामिल करने के लिए बदल किया जाना है।

+1

कृपया मुझे बताएं कि मुझे वह प्रमाणपत्र कहां मिल रहा है जिसका आप उल्लेख कर रहे हैं? –

+1

यह समझ में आता है, लेकिन आपको प्रमाणपत्र कहां से मिला? –

+0

मैं एक ट्यूटोरियल का अनुसरण कर रहा था, और मैं temp प्रमाणपत्र 'AddTemporarySigningCredential()' का उपयोग कर रहा था, इसलिए वेब ऐप रीफ्रेश करने के बाद, यह काम करता है। – Jaider

संबंधित मुद्दे