জেডাব্লুটি টোকনকে কীভাবে ডিকোড করবেন?


109

এই লাইব্রেরিটি কীভাবে কাজ করে তা আমি বুঝতে পারি না। তুমি আমাকে সাহায্য করতে পারবে কি ?

আমার সরল কোডটি এখানে:

public void TestJwtSecurityTokenHandler()
    {
        var stream =
            "eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJJU1MiLCJzY29wZSI6Imh0dHBzOi8vbGFyaW0uZG5zY2UuZG91YW5lL2NpZWxzZXJ2aWNlL3dzIiwiYXVkIjoiaHR0cHM6Ly9kb3VhbmUuZmluYW5jZXMuZ291di5mci9vYXV0aDIvdjEiLCJpYXQiOiJcL0RhdGUoMTQ2ODM2MjU5Mzc4NClcLyJ9";
        var handler = new JwtSecurityTokenHandler();

        var jsonToken = handler.ReadToken(stream);
    }

এটি ত্রুটি:

স্ট্রিংটি কমপ্যাক্ট জেএসএন ফর্ম্যাটে থাকা দরকার যা এই ফর্মের: বেস64 ইউআরএল কোডডহাইডার.বেস U৪ ইউআরএলকোডডপায়লোড.অপশন, বেস 64৪ ইউআরএলকনডেড সিগনেচার '।

আপনি যদি jwt.io ওয়েবসাইটে স্ট্রিমটি অনুলিপি করেন তবে এটি দুর্দান্ত কাজ করে :)


4
jwt, io সাইট এটিকে ডিকোড করে তবে কোনও স্বাক্ষর নেই তাই এটি অবৈধ।
ক্রাউড কোডার


উত্তর:


187

আমি সমাধানটি পেয়েছি, আমি ফলাফলটি ফেলে দিতে ভুলে গেছি:

var stream ="[encoded jwt]";  
var handler = new JwtSecurityTokenHandler();
var jsonToken = handler.ReadToken(stream);
var tokenS = handler.ReadToken(stream) as JwtSecurityToken;

আমি ব্যবহার করে দাবিগুলি পেতে পারি:

var jti = tokenS.Claims.First(claim => claim.Type == "jti").Value;

4
আমাকে প্রথমে দাবির একটি তালিকা হিসাবে টোকেনএস.ক্লেমগুলি কাস্ট করতে হয়েছিল। ((List<Claim>)tokenS.Claims).ForEach(a => Console.WriteLine(a.Type.ToString() + " " + a.Value));
রিনালাদি সেগেসিন

12
আপনি এটিও করতে পারেন: হ্যান্ডেলার.আরডজেডটোকেন (টোকেনজেডট্রিপোনস.অ্যাক্সেস_ টোকেন);
থাবিসো মফোকেনগ

15
দুঃখিত যদি এটি সুস্পষ্ট হওয়া উচিত তবে কোথা tokenJwtReponse.access_tokenথেকে আসছে?
জেফ স্ট্যাপলেটন

4
টোকেনজেডটিআরপিওন্স.এ্যাক্সেস_ টোকেন কোথা থেকে আসছে?
3iL

5
যেমন অন্যরা ইতিমধ্যে প্রশ্ন করেছে: "টোকেনজেডট্রিপোনস.অ্যাক্সেস_ টোকেন" কোথা থেকে এসেছে? উত্তরে এর কোন সংজ্ঞা বা ঘোষণা নেই, উত্তরটি আমাদের অনেকের পক্ষে অকেজো এবং অর্থহীন করে তুলেছে।
জেক 2

36

new JwtSecurityTokenHandler().ReadToken("") ফিরে আসবে a SecurityToken

new JwtSecurityTokenHandler().ReadJwtToken("") ফিরে আসবে a JwtSecurityToken

আপনি কেবল যে পদ্ধতিটি ব্যবহার করছেন তা যদি আপনি পরিবর্তন করেন তবে উপরের উত্তরের কাস্ট এড়াতে পারবেন


17

আপনার গোপন স্ট্রিং দরকার যা এনক্রিপ্ট টোকেন তৈরি করতে ব্যবহৃত হয়েছিল। এই কোডটি আমার পক্ষে কাজ করে:

protected string GetName(string token)
    {
        string secret = "this is a string used for encrypt and decrypt token"; 
        var key = Encoding.ASCII.GetBytes(secret);
        var handler = new JwtSecurityTokenHandler();
        var validations = new TokenValidationParameters
        {
            ValidateIssuerSigningKey = true,
            IssuerSigningKey = new SymmetricSecurityKey(key),
            ValidateIssuer = false,
            ValidateAudience = false
        };
        var claims = handler.ValidateToken(token, validations, out var tokenSecure);
        return claims.Identity.Name;
    }

আপনি handler.ReadToken(token) as SecurityTokenযখন outপরে এটিকে আপনার প্যারামিটার হিসাবে পুনরায় নিয়োগ দিচ্ছেন তখন কেন আপনি কল করবেন ? ValidateTokenব্যর্থ হওয়ার এবং আসল মানটি রাখার কি কোনও সম্ভাবনা আছে ?
ক্রিলগার

ডান ক্রিলগার সুরক্ষা টোকেনকে নিক্ষিপ্ত নয়
পাতো মিলান

ভ্যালিডেটটোকেন কি সমাপ্তির পরীক্ষা করে? বা ডিকোড হওয়ার পরে আমার নিজের যাচাই করা দরকার?
গণনা

9

.Net কোর jwt প্যাকেজগুলি ব্যবহার করে, দাবিগুলি উপলব্ধ:

[Route("api/[controller]")]
[ApiController]
[Authorize(Policy = "Bearer")]
public class AbstractController: ControllerBase
{
    protected string UserId()
    {
        var principal = HttpContext.User;
        if (principal?.Claims != null)
        {
            foreach (var claim in principal.Claims)
            {
               log.Debug($"CLAIM TYPE: {claim.Type}; CLAIM VALUE: {claim.Value}");
            }

        }
        return principal?.Claims?.SingleOrDefault(p => p.Type == "username")?.Value;
    }
}

8
  var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Jwt:Key"]));
  var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
  var claims = new[]
  {
      new Claim(JwtRegisteredClaimNames.Email, model.UserName),
      new Claim(JwtRegisteredClaimNames.NameId, model.Id.ToString()),
  };
  var token = new JwtSecurityToken(_config["Jwt:Issuer"],
      _config["Jwt:Issuer"],
      claims,
      expires: DateTime.Now.AddMinutes(30),
      signingCredentials: creds);

তারপরে সামগ্রী বের করুন

 var handler = new JwtSecurityTokenHandler();
 string authHeader = Request.Headers["Authorization"];
 authHeader = authHeader.Replace("Bearer ", "");
 var jsonToken = handler.ReadToken(authHeader);
 var tokenS = handler.ReadToken(authHeader) as JwtSecurityToken;
 var id = tokenS.Claims.First(claim => claim.Type == "nameid").Value;

3

কুক্কি উত্তর এবং ডিপিক্স উত্তরের উপর প্রসারিত করার সময়, আপনি যখন ডাব্লু টু টোইন পড়ছেন (যেমন এডি এফএস থেকে প্রাপ্ত একটি এক্সেস_ টোকেন), আপনি "প্রাসঙ্গিক.অথেনটিকেশনটিকট.আইডেন্টিটি" থেকে প্রাপ্ত দাবির সাথে jwt টোকেনে দাবিগুলি মার্জ করতে পারেন might jwt টোকেনের মতো একই দাবির সেট করুন।

উদাহরণস্বরূপ, ওপেনআইডি কানেক্ট ব্যবহার করে একটি প্রমাণীকরণ কোড প্রবাহে, কোনও ব্যবহারকারী সত্যায়িত হওয়ার পরে, আপনি ইভেন্টটি সিকিউরিটি টোকেনভালিটেড পরিচালনা করতে পারেন যা আপনাকে একটি প্রমাণীকরণের প্রসঙ্গ সরবরাহ করে, তারপরে আপনি এটিকে jwt টোকেন হিসাবে অ্যাক্সেস_ টোকনটি পড়তে ব্যবহার করতে পারেন, তবে আপনি " ব্যবহারকারী পরিচয়ের অংশ হিসাবে প্রাপ্ত দাবির মানক তালিকার সাথে অ্যাক্সেস-টোকনে থাকা টোকেনগুলি মার্জ করুন:

    private Task OnSecurityTokenValidated(SecurityTokenValidatedNotification<OpenIdConnectMessage,OpenIdConnectAuthenticationOptions> context)
    {
        //get the current user identity
        ClaimsIdentity claimsIdentity = (ClaimsIdentity)context.AuthenticationTicket.Identity;

        /*read access token from the current context*/
        string access_token = context.ProtocolMessage.AccessToken;

        JwtSecurityTokenHandler hand = new JwtSecurityTokenHandler();
        //read the token as recommended by Coxkie and dpix
        var tokenS = hand.ReadJwtToken(access_token);
        //here, you read the claims from the access token which might have 
        //additional claims needed by your application
        foreach (var claim in tokenS.Claims)
        {
            if (!claimsIdentity.HasClaim(claim.Type, claim.Value))
                claimsIdentity.AddClaim(claim);
        }

        return Task.FromResult(0);
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.