System.IdentityModel.Tokens.Jwt का उपयोग करके JWT टोकन को डिकोड करना और सत्यापित करना


101

मैं एक Json वेब टोकन को डीकोड करने के लिए JWT लाइब्रेरी का उपयोग कर रहा हूं , और Microsoft के आधिकारिक JWT कार्यान्वयन, System.IdentityModel.Tokens.Jwt पर स्विच करना चाहूंगा ।

प्रलेखन बहुत विरल है, इसलिए मैं एक कठिन समय लगा रहा हूं कि यह कैसे पूरा करूं कि मैं जेडब्ल्यूटी पुस्तकालय के साथ क्या कर रहा हूं। JWT लाइब्रेरी के साथ, एक डिकोड विधि है जो बेस 64 एन्कोडेड JWT को ले जाती है और इसे JSON में बदल देती है, जिसे बाद में deserialized किया जा सकता है। मैं System.IdentityModel.Tokens.Jwt का उपयोग करके कुछ ऐसा ही करना चाहता हूं, लेकिन उचित मात्रा में खुदाई के बाद, यह पता नहीं लगा सकता कि कैसे।

Google के पहचान ढांचे के साथ उपयोग करने के लिए, मैं JWT टोकन को कुकी से पढ़ रहा हूं।

किसी भी सहायता की सराहना की जाएगी।



Google प्रमाणपत्र लाने और टोकन को सत्यापित करने के तरीके के बारे में एक हाथ से जवाब यहां दिया गया है - stackoverflow.com/questions/29757140/…
rothschild86

जवाबों:


147

पैकेज के भीतर एक वर्ग है जिसे कहा जाता JwtSecurityTokenHandlerहै System.IdentityModel.Tokens.SecurityTokenHandler। WIF में यह डिस्क्रिविलाइज़िंग और सीरीज़िंग सिक्योरिटी टोकन के लिए मुख्य वर्ग है।

कक्षा में एक ReadToken(String)विधि है जो आपके बेस 64 को JWT स्ट्रिंग को इनकोडेड करेगी और रिटर्न देगी SecurityTokenजो JWT का प्रतिनिधित्व करती है।

यह SecurityTokenHandlerभी एक ValidateToken(SecurityToken)विधि है जो आपकी लेता है SecurityTokenऔर एक बनाता है ReadOnlyCollection<ClaimsIdentity>। आमतौर पर JWT के लिए, इसमें एक एकल ClaimsIdentityऑब्जेक्ट होगा जिसमें मूल JWT के गुणों का प्रतिनिधित्व करने वाले दावों का एक सेट होता है।

JwtSecurityTokenHandlerकुछ अतिरिक्त अधिभार को परिभाषित करता है ValidateToken, विशेष रूप से, इसमें एक ClaimsPrincipal ValidateToken(JwtSecurityToken, TokenValidationParameters)अधिभार है। TokenValidationParametersतर्क आप टोकन पर हस्ताक्षर प्रमाणपत्र (की एक सूची के रूप में निर्दिष्ट कर सकते हैं X509SecurityTokens)। इसमें एक अधिभार भी है जो JWT को एक के stringबजाय लेता है SecurityToken

ऐसा करने के लिए कोड बल्कि जटिल है, लेकिन TokenValidationHandlerडेवलपर नमूना में Global.asax.cx कोड ( वर्ग) में पाया जा सकता है, जिसे "ADAL - Native App to REST सर्विस - ACS विथ ब्राउज़र डायलॉग के माध्यम से प्रमाणीकरण" स्थित है।

http://code.msdn.microsoft.com/AAL-Native-App-to-REST-de57f2cc

वैकल्पिक रूप से, JwtSecurityTokenवर्ग में अतिरिक्त विधियां हैं जो आधार SecurityTokenवर्ग पर नहीं हैं , जैसे कि एक Claimsसंपत्ति जो ClaimsIdentityसंग्रह के माध्यम से जाने के बिना निहित दावे प्राप्त करती है । इसमें एक Payloadसंपत्ति भी है जो एक JwtPayloadवस्तु देता है जो आपको टोकन के कच्चे JSON पर मिलता है। यह आपके परिदृश्य पर निर्भर करता है जो इसे सबसे उपयुक्त लगता है।

SecurityTokenHandlerवर्ग के लिए सामान्य (यानी गैर JWT विशिष्ट) प्रलेखन है

http://msdn.microsoft.com/en-us/library/system.identitymodel.tokens.securitytokenhandler.aspx

आपके आवेदन के आधार पर, आप JWT हैंडलर को किसी भी अन्य हैंडलर की तरह ही WIF पाइपलाइन में कॉन्फ़िगर कर सकते हैं।

इसके विभिन्न प्रकार के अनुप्रयोग में उपयोग के 3 नमूने हैं

http://code.msdn.microsoft.com/site/search?f%5B0%5D.Type=SearchText&f%5B0%5D.Value=aal&f%5B1%5D.Type=User&f%5B1%5D.Value=Azure% 20AD% 20Developer% 20Experience% 20Team और च% 5B1% 5D.Text = Azure% 20AD% 20Developer% 20Experience% 20Team

शायद, कोई आपकी आवश्यकताओं के अनुरूप होगा या कम से कम उनके अनुकूल होगा।


3
मैं वास्तव में आपके उत्तर की सराहना करता हूं। इसलिए, जब एक बार मेरे पास दावा है, मैं इसे सार्वजनिक कुंजी के खिलाफ कैसे सत्यापित करूं? विशेष रूप से, मैं अपने सार्वजनिक कुंजी (के खिलाफ एक गूगल पहचान टूलकिट जेडब्ल्यूटी सत्यापित करने के लिए कोशिश कर रहा हूँ gstatic.com/authtoolkit/cert/gitkit_cert.pem )
w.brian

4
मेरे उत्तर को अपडेट किया - मैं इसके लिए पूर्ण स्रोत को फिट नहीं कर सका, लेकिन मैंने आपको उपयुक्त डेवलपर नमूने की दिशा में बताया। आशा करता हूँ की ये काम करेगा।
माइक गुडविन

4
@ w.brian - मैं यही करने की कोशिश कर रहा हूं। मेरे पास एक टोकन है जिसे मैं डिकोड कर सकता हूं, और एक सार्वजनिक कुंजी जिसे मैं सत्यापित करना चाहता हूं, लेकिन यहां तक ​​कि इन नमूनों को देखकर मैं यह देखने के लिए संघर्ष कर रहा हूं कि मैं यह कैसे करता हूं। क्या आपके पास कोई संकेत है कि वास्तव में किस कोड ने आपकी मदद की है? धन्यवाद।
बरगैस्ट

26

मैं बस सोच रहा हूं कि जेडब्ल्यूटी टोकन डिकोडिंग और सत्यापन के लिए कुछ पुस्तकालयों का उपयोग क्यों करें।

Pseudocode का उपयोग करके एन्कोडेड JWT टोकन बनाया जा सकता है

var headers = base64URLencode(myHeaders);
var claims = base64URLencode(myClaims);
var payload = header + "." + claims;

var signature = base64URLencode(HMACSHA256(payload, secret));

var encodedJWT = payload + "." + signature;

किसी भी विशिष्ट पुस्तकालय के बिना करना बहुत आसान है। निम्नलिखित कोड का उपयोग करना:

using System;
using System.Text;
using System.Security.Cryptography;

public class Program
{   
    // More info: https://stormpath.com/blog/jwt-the-right-way/
    public static void Main()
    {           
        var header = "{\"typ\":\"JWT\",\"alg\":\"HS256\"}";
        var claims = "{\"sub\":\"1047986\",\"email\":\"jon.doe@eexample.com\",\"given_name\":\"John\",\"family_name\":\"Doe\",\"primarysid\":\"b521a2af99bfdc65e04010ac1d046ff5\",\"iss\":\"http://example.com\",\"aud\":\"myapp\",\"exp\":1460555281,\"nbf\":1457963281}";

        var b64header = Convert.ToBase64String(Encoding.UTF8.GetBytes(header))
            .Replace('+', '-')
            .Replace('/', '_')
            .Replace("=", "");
        var b64claims = Convert.ToBase64String(Encoding.UTF8.GetBytes(claims))
            .Replace('+', '-')
            .Replace('/', '_')
            .Replace("=", "");

        var payload = b64header + "." + b64claims;
        Console.WriteLine("JWT without sig:    " + payload);

        byte[] key = Convert.FromBase64String("mPorwQB8kMDNQeeYO35KOrMMFn6rFVmbIohBphJPnp4=");
        byte[] message = Encoding.UTF8.GetBytes(payload);

        string sig = Convert.ToBase64String(HashHMAC(key, message))
            .Replace('+', '-')
            .Replace('/', '_')
            .Replace("=", "");

        Console.WriteLine("JWT with signature: " + payload + "." + sig);        
    }

    private static byte[] HashHMAC(byte[] key, byte[] message)
    {
        var hash = new HMACSHA256(key);
        return hash.ComputeHash(message);
    }
}

टोकन डिकोडिंग ऊपर दिए गए कोड का संस्करण है। हस्ताक्षर को सत्यापित करने के लिए आपको उसी की आवश्यकता होगी और गणना किए गए हस्ताक्षर के साथ हस्ताक्षर वाले भाग की तुलना करें।

अद्यतन: कैसे उन लोगों के लिए जो संघर्ष कर रहे हैं कि बेस 64 urlsafe एन्कोडिंग / डिकोडिंग कैसे करें तो एक और SO प्रश्न देखें , और विकी और RFC भी


2
अच्छा उत्तर। यद्यपि आप एचएमएसी आधारित हस्ताक्षर दिखाने के बाद से, यह पुस्तकालयों में कुछ महत्वपूर्ण कमजोरियों के बारे में पता करने के लिए समझ में आ सकता है जो एचएमएसी
सुधांशु मिश्रा

2
मुझे लगता है कि यह सबसे अच्छा जवाब है। ओपी ने विशेष रूप से जेडब्ल्यूटी के बारे में जानकारी मांगी, जिसे यह लेख स्पष्ट उदाहरण के साथ संबोधित करता है ..
वेबवार्ता

13
इस उत्तर बताते हैं और दर्शाता है कि कैसे करने के लिए एन कोड एक जेडब्ल्यूटी जब सवाल के बारे में काफी स्पष्ट रूप है डी कोडिंग। यह एक अच्छा जवाब हो सकता है लेकिन यह पूरी तरह से अलग सवाल का जवाब है
डेल्टिक्स

2
@ डेल्टिक्स मुझे लगता है कि टोकन को डिकोड करने के लिए एन्कोडिंग एल्गोरिथ्म को फिर से लिखने के लिए कंप्यूटर विज्ञान की डिग्री की भी आवश्यकता नहीं है। यदि आप समझते हैं कि कैसे एनकोड करना है - तो आप समझ सकते हैं कि कैसे डिकोड करना है
Regfor

31
एक "उत्तर" का विचार एक प्रश्न को संबोधित करना है, न कि किसी प्रकार की रिवर्स-मंशा पहेली को हल करने की अपेक्षा करके किसी पहेली को हल करना। बेडसाइड, यह जानना कि कैसे सांकेतिक शब्दों में बदलना जरूरी नहीं है कि आप भी तब डिकोड करना जानते हैं क्योंकि इसमें 3 पार्टी टोकन से निपटने और अपने हस्ताक्षर को सत्यापित करने के लिए कुंजी प्राप्त करना शामिल हो सकता है, जैसा कि बस अपने स्वयं के हस्ताक्षर करने के लिए एक कुंजी का उपयोग करने के विपरीत है। किसी भी घटना में, एक जवाब है कि है नहीं वास्तव में परिभाषा से सवाल का जवाब है नहीं " बेहतर " जवाब है जब एक की तुलना करता है जो अवलोकन करने के लिए मैं जवाब था,।
डेल्टिक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.