JWT टोकन को डीकोड कैसे करें?


101

मुझे समझ नहीं आया कि यह लाइब्रेरी कैसे काम करती है। क्या आप कृपया मेरी मदद कर सकते हैं ?

यहाँ मेरा सरल कोड है:

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

        var jsonToken = handler.ReadToken(stream);
    }

यह त्रुटि है:

स्ट्रिंग को कॉम्पैक्ट JSON फॉर्मेट में होना चाहिए, जो फॉर्म का है: Base64UrlEncodedHeader.Base64UrlEndcodedPayload.OPTIONAL, Base64UrlEncodedSatureature '।

यदि आप jwt.io वेबसाइट में स्ट्रीम कॉपी करते हैं , तो यह ठीक काम करता है :)


1
jwt, io साइट इसे डिकोड करती है, लेकिन कोई हस्ताक्षर नहीं है इसलिए यह अमान्य है।
क्रॉकरोड


1
@MichaelFreidgeim आप सही हैं यह डुप्लिकेट प्रश्न है ... लेकिन उत्तर आपके द्वारा उपयोग किए जाने वाले संस्करण लाइब्रेरी के कारण भिन्न हैं
Cooxkie

जवाबों:


175

मुझे समाधान मिला, मैं सिर्फ परिणाम कास्ट करना भूल गया:

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;

2
मुझे पहले टोकन की सूची के रूप में टोकन कास्ट करना था। ((List<Claim>)tokenS.Claims).ForEach(a => Console.WriteLine(a.Type.ToString() + " " + a.Value));
रिनाल्डी सेगसीन

12
आप यह भी कर सकते हैं: हैंडलर।
थिबिसो मोफोकेंग

13
क्षमा करें यदि यह स्पष्ट होना चाहिए लेकिन कहाँ से tokenJwtReponse.access_tokenआ रहा है?
जेफ स्टेपटन

3
TokenJwtReponse.access_token कहाँ से आ रहा है?
आईएल

4
जैसा कि अन्य लोग पहले ही सवाल कर चुके हैं: "tokenJwtReponse.access_token" कहाँ से आता है? उत्तर में इसके लिए कोई परिभाषा या घोषणा नहीं है, जिससे उत्तर हम में से कई के लिए बेकार और अर्थहीन हो जाता है।
Zeek2

33

new JwtSecurityTokenHandler().ReadToken("") वापस आ जाएगा SecurityToken

new JwtSecurityTokenHandler().ReadJwtToken("") वापस आ जाएगा JwtSecurityToken

यदि आप केवल उस विधि को बदलते हैं जो आप उपयोग कर रहे हैं तो आप उपरोक्त उत्तर में कलाकारों से बच सकते हैं


16

आपको गुप्त स्ट्रिंग की आवश्यकता है जो एन्क्रिप्टेड टोकन उत्पन्न करने के लिए उपयोग किया गया था। यह कोड मेरे लिए काम करता है:

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विफल हो जाती है और मूल मूल्य रखा जाता है?
क्रिलगर

सही क्रिलगार सुरक्षा के लिए कलाकार नहीं है
पेटो मिलन

क्या ValidateToken समाप्ति की जाँच करता है? या क्या मुझे इसे डिकोड करने के बाद स्वयं को मान्य करने की आवश्यकता है?
computrius

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

6
  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

Cooxkie उत्तर, और dpix उत्तर पर विस्तार करते हुए , जब आप एक jwt टोकन पढ़ रहे होते हैं (जैसे कि AD FS से प्राप्त एक access_token), तो आप jwt टोकन में "संदर्भ.AuthenticationTicket.Identity" के दावों के साथ दावे को मर्ज कर सकते हैं। jwt टोकन के रूप में दावों का एक ही सेट है।

किसी उपयोगकर्ता द्वारा प्रमाणित होने के बाद, OpenID कनेक्ट का उपयोग करके एक प्रमाणीकरण कोड प्रवाह में चित्रण करने के लिए, आप घटना को संभाल सकते हैं SecurityTokenValidated जो आपको एक प्रमाणीकरण संदर्भ प्रदान करता है, तो आप इसे jwt टोकन के रूप में access_token पढ़ने के लिए उपयोग कर सकते हैं, फिर आप कर सकते हैं " मर्ज "टोकन जो उपयोगकर्ता पहचान के भाग के रूप में प्राप्त दावों की मानक सूची के साथ access_token में हैं:

    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);
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.