System.IdentityModel.Tokens.Jwt ব্যবহার করে JWT টোকেনটি ডিকোডিং এবং যাচাই করা হচ্ছে


103

আমি ব্যবহার করছি JWT একটি JSON- ওয়েব টোকেন ডিকোড করতে গ্রন্থাগার, এবং মাইক্রোসফট এর অফিসিয়াল JWT প্রয়োগ, স্যুইচ করতে চাই System.IdentityModel.Tokens.Jwt

ডকুমেন্টেশন খুব অপ্রয়োজনীয়, তাই আমি জেডাব্লুটি লাইব্রেরিতে কী করে যাচ্ছিলাম তা কীভাবে সম্পাদন করতে হবে তা নির্ধারণ করার জন্য আমার খুব কষ্ট হচ্ছে। জেডাব্লুটি লাইব্রেরির সাথে একটি ডিকোড পদ্ধতি রয়েছে যা বেস 64৪ টি এনকোডেড জেডাব্লুটিটি নিয়ে যায় এবং এটিকে জেএসওনে রূপান্তর করে যা এরপরে deserialized করা যেতে পারে। আমি System.IdentityModel.Tokens.Jwt ব্যবহার করে অনুরূপ কিছু করতে চাই, তবে যথেষ্ট পরিমাণ খনন করার পরে, কীভাবে তা বুঝতে পারছি না।

এটির জন্য মূল্যবান, আমি গুগলের পরিচয় কাঠামোর সাথে ব্যবহারের জন্য একটি কুকি থেকে জেডাব্লুটি টোকনটি পড়ছি।

কোন সাহায্য প্রশংসা করা হবে।



গুগল শংসাপত্রগুলি কীভাবে আনতে হবে এবং টোকেন যাচাই করার জন্য এখানে একটি উত্তর - stackoverflow.com/questions/29757140/…
রথসচাইল্ড 86

উত্তর:


153

প্যাকেজের মধ্যে একটি ক্লাস বলা হয় JwtSecurityTokenHandlerযা থেকে প্রাপ্ত System.IdentityModel.Tokens.SecurityTokenHandler। ডাব্লুআইএফ-তে এটি সুরক্ষা টোকেনকে ডিসেরায়ালাইজিং এবং সিরিয়ালাইজ করার মূল বর্গ।

শ্রেণীর একটি ReadToken(String)পদ্ধতি রয়েছে যা আপনার বেস 64 এনকোডেড JWT স্ট্রিংটি নেবে এবং SecurityTokenএটি JWT প্রতিনিধিত্ব করে returns

SecurityTokenHandlerআরো একটি আছে ValidateToken(SecurityToken)পদ্ধতি যা আপনার নেয় SecurityTokenএবং একটি সৃষ্টি ReadOnlyCollection<ClaimsIdentity>। সাধারণত জেডব্লিউটি এর জন্য, এটিতে একটি একক ClaimsIdentityঅবজেক্ট থাকবে যা মূল জেডাব্লুটিটির বৈশিষ্ট্য উপস্থাপন করে এমন দাবিগুলির একটি সেট রয়েছে।

JwtSecurityTokenHandlerকিছু অতিরিক্ত ওভারলোড বোঝায় ValidateTokenবিশেষত, এটির একটি ClaimsPrincipal ValidateToken(JwtSecurityToken, TokenValidationParameters)ওভারলোড রয়েছে। TokenValidationParametersযুক্তি আপনি কি টোকেন স্বাক্ষরের সার্টিফিকেট (একটি তালিকা হিসাবে নির্দিষ্ট করার অনুমতি দেয় X509SecurityTokens)। এটিতে একটি ওভারলোডও রয়েছে যা JWT কে stringপরিবর্তে একটি হিসাবে গ্রহণ করে SecurityToken

এটি করার কোডটি বরং জটিল, তবে TokenValidationHandler"ADAL - নেটিভ অ্যাপ থেকে আরএসটি পরিষেবা - ব্রাউজার ডায়ালগের মাধ্যমে এসিএসের সাথে প্রমাণীকরণ" নামক বিকাশকারী নমুনায় গ্লোবাল.এক্সএক্স.এক্স কোড ( শ্রেণি) পাওয়া যাবে at

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

বিকল্পভাবে, JwtSecurityTokenশ্রেণীর অতিরিক্ত পদ্ধতি রয়েছে যা বেস SecurityTokenক্লাসে নেই, যেমন একটি Claimsসম্পত্তি যা ClaimsIdentityসংগ্রহের মাধ্যমে না গিয়ে সংযুক্ত দাবিগুলি অর্জন করে । এটিতে এমন একটি Payloadসম্পত্তি রয়েছে যা কোনও JwtPayloadঅবজেক্ট ফেরত দেয় যা আপনাকে টোকেনের কাঁচা জেএসএন এ পেতে দেয়। এটি আপনার দৃশ্যের উপর নির্ভর করে যা এটি সবচেয়ে উপযুক্ত approach

SecurityTokenHandlerশ্রেণীর জন্য সাধারণ (অর্থাত্ জেডাব্লুটি নির্দিষ্ট নয়) ডকুমেন্টেশন রয়েছে

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

আপনার অ্যাপ্লিকেশন উপর নির্ভর করে, আপনি ডাব্লুআইএফ পাইপলাইনে ঠিক অন্য কোনও হ্যান্ডলারের মতো জেডাব্লুটি হ্যান্ডলারটি কনফিগার করতে পারেন।

বিভিন্ন ধরণের প্রয়োগে এটির 3 টি নমুনা ব্যবহৃত হচ্ছে use

http://code.msdn.microsoft.com/site/search?f%5B0%5D.Type=S SearchText&f%5B0%5D.Value=aal&f%5B1%5D.Type=User&f%5B1%5D.Value=Azure% 20AD% 20 ডেভেলপার% 20 অভিজ্ঞতা% 20 টিম এবং এফ% 5 বি 1% 5 ডি। পাঠ্য = অ্যাজুর% 20AD% 20 ডেভেলপার% 20 অভিজ্ঞতা% 20 টিম

সম্ভবত, কেউ আপনার প্রয়োজনগুলির স্যুট করবে বা কমপক্ষে তাদের সাথে খাপ খাইয়ে নেবে।


4
আমি আপনার উত্তর সত্যিই প্রশংসা করি। সুতরাং, একবার আমার কাছে ক্লেইমসডেন্টিটি হয়ে গেলে, আমি কীভাবে এটি সর্বজনীন কী-এর বিপরীতে যাচাই করব? বিশেষত, আমি তাদের পাবলিক কী ( gstatic.com/authtoolkit/cert/gitkit_cert.pem ) এর বিপরীতে একটি গুগল আইডেন্টিটি টুলকিট জেডাব্লুটিটি যাচাই করার চেষ্টা করছি
w.brian

4
আমার উত্তর আপডেট করেছে - আমি এটির জন্য পুরো উত্সটি ফিট করতে পারি না, তবে আমি আপনাকে উপযুক্ত বিকাশকারী নমুনার দিকে নির্দেশ করেছি। আশা করি এটা সাহায্য করবে.
মাইক গুডউইন

4
@ w.brian - আমিও তাই করার চেষ্টা করছি do আমার একটি টোকেন রয়েছে যা আমি ডিকোড করতে পারি এবং একটি সার্বজনিক কী যা আমি যাচাই করতে চাই, কিন্তু এই নমুনাগুলির দিকে তাকিয়েও আমি কীভাবে এটি করি তা দেখার জন্য আমি লড়াই করছি। আসলে কোন কোডটি আপনাকে সহায়তা করেছিল তাতে আপনার কি কোনও পয়েন্টার রয়েছে? ধন্যবাদ
বারগাস্ট

28

আমি কেবল ভাবছি কেন জেডাব্লুটি টোকেন ডিকোডিং এবং যাচাইয়ের জন্য কিছু লাইব্রেরি ব্যবহার করবেন না।

নিম্নলিখিত সিউডোকোড ব্যবহার করে এনকোডড জেডাব্লুটি টোকেন তৈরি করা যেতে পারে

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);
    }
}

টোকেন ডিকোডিং উপরের কোডটির বিপরীত সংস্করণ the স্বাক্ষরটি যাচাই করতে আপনার একই প্রয়োজন হবে এবং গণনা স্বাক্ষরের সাথে স্বাক্ষরের অংশের তুলনা করুন।

আপডেট: তাদের জন্য কীভাবে বেস lsa64 টি ইউরালফের এনকোডিং / ডিকোডিং করা যায় তা নিয়ে লড়াই করে যাচ্ছেন দয়া করে অন্য একটি এসও প্রশ্ন , এবং উইকি এবং আরএফসিও দেখুন


4
চমৎকার উত্তর. যদিও আপনি এখানে এইচএমএসি ভিত্তিক স্বাক্ষর দেখান, তবুও লাইব্রেরিতে এমন কিছু সমালোচনামূলক দুর্বলতা সম্পর্কে সচেতন হওয়া বোধগম্য হতে পারে যা এইচটিএইচ সাইটটিতে বিস্তারিত হিসাবে HMAC যাচাইকরণ বাস্তবায়ন করে: auth0.com/blog/2015/03/31/…
সুধাংশু মিশ্র

4
আমি মনে করি এটি সেরা উত্তর। ওপি জেডব্লিউটি সম্পর্কে বিশেষভাবে তথ্যের জন্য অনুরোধ করেছে যা এই নিবন্ধটি একটি সুস্পষ্ট উদাহরণ সহ সম্বোধন করেছে ..
ওয়েবওয়ার্ম

15
এই উত্তরটি ব্যাখ্যা এবং প্রমান কিভাবে স্বীকারোক্তি কোড একটি JWT যখন প্রশ্ন সম্পর্কে বেশ স্পষ্ট হয় ডি কোডিং। এটি একটি দুর্দান্ত উত্তর হতে পারে তবে এটি সম্পূর্ণ ভিন্ন প্রশ্নের উত্তর ।
ডেলটিকস

34
"উত্তর" ধারণাটি কোনও প্রশ্নকে সম্বোধন করা, কারও কাছে প্রত্যাশা করে ধাঁধা না দেওয়া, কোনওরকম বিপরীত অভিপ্রায় ধাঁধা সমাধান করা উচিত। বেডসাইডস, কীভাবে এনকোড করতে হবে তা বোঝার অর্থ এই নয় যে আপনি কীভাবে ডিকোড করবেন তাও জানেন যেহেতু এটিতে তৃতীয় পক্ষের টোকেনগুলির সাথে ডিল করা এবং তাদের স্বাক্ষরগুলি যাচাই করার জন্য কীগুলি পুনরুদ্ধার করা জড়িত থাকতে পারে, কেবল নিজের নিজের স্বাক্ষরের জন্য কী ব্যবহার করার বিপরীতে। যে কোনো ক্ষেত্রেই, একটি উত্তর যে নেই না আসলে সংজ্ঞা দ্বারা প্রশ্নের উত্তর হয় না " ভাল " উত্তর যখন কেউ তুলনায় করে যা পর্যবেক্ষণ আমি সাড়া হয়েছিল।
ডেলিক্স

4
আপনি কী করছেন তা সত্যই যদি না জেনে থাকেন তবে নিজেকে সুরক্ষা সম্পর্কিত অংশগুলি কোড করবেন না। এমন কিছু কিছু আছে যা আপনি সহজেই ভুল করতে পারেন। নিখুঁত সত্য যে দুর্বল jwt গ্রন্থাগারগুলি প্রমাণ করে যে এটি নিজেকে কোড করা একটি খারাপ ধারণা, যদি না আপনি সত্যিই ভাবেন যে আপনি JWT এই লাইব্রেরির লেখকদের চেয়ে ভাল জানেন T তবে এই উত্তরটি এখনও জেডব্লিউটি বোঝার জন্য কার্যকর gain
ক্রিস্টোফার কে।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.