2017-04-18 9 views
8

मैं जेडब्ल्यूटी का उपयोग कर एएसपीनेट कोर का उपयोग कर एक वेब एपीआई लागू करने की प्रक्रिया में हूं। मैं पहचानकर्ता सर्वर 4 जैसे तीसरे पक्ष के समाधान का उपयोग नहीं कर रहा हूं क्योंकि मैं सीखने की कोशिश कर रहा हूं।एएसपीनेट कोर वेब एपीआई (कोई तीसरी पार्टी) में जेडब्ल्यूटी रीफ्रेश टोकन को कैसे कार्यान्वित करें?

मैं काम करने के लिए जेडब्ल्यूटी विन्यास मिल गया है, लेकिन कैसे जब जेडब्ल्यूटी के समय सीमा समाप्त हो के लिए ताज़ा टोकन को लागू करने पर स्टम्प्ड रहा हूँ।

नीचे startup.cs अंदर मेरे कॉन्फ़िगर विधि में कुछ नमूना कोड है।

app.UseJwtBearerAuthentication(new JwtBearerOptions() 
{ 
    AuthenticationScheme = "Jwt", 
    AutomaticAuthenticate = true, 
    AutomaticChallenge = true, 
    TokenValidationParameters = new TokenValidationParameters() 
    { 
     ValidAudience = Configuration["Tokens:Audience"], 
     ValidIssuer = Configuration["Tokens:Issuer"], 
     ValidateIssuerSigningKey = true, 
     IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Tokens:Key"])), 
     ValidateLifetime = true, 
     ClockSkew = TimeSpan.Zero 
    } 
}); 

नीचे जेडब्ल्यूटी उत्पन्न करने के लिए उपयोग की जाने वाली नियंत्रक विधि है। मैंने परीक्षण उद्देश्यों के लिए 30 सेकंड की समाप्ति निर्धारित की है।

[Route("Token")] 
    [HttpPost] 
    public async Task<IActionResult> CreateToken([FromBody] CredentialViewModel model) 
    { 
     try 
     { 
      var user = await _userManager.FindByNameAsync(model.Username); 

      if (user != null) 
      { 
       if (_hasher.VerifyHashedPassword(user, user.PasswordHash, model.Password) == PasswordVerificationResult.Success) 
       { 
        var userClaims = await _userManager.GetClaimsAsync(user); 

        var claims = new[] 
        { 
         new Claim(JwtRegisteredClaimNames.Sub, user.UserName), 
         new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()) 
        }.Union(userClaims); 

        var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_jwt.Key)); 
        var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); 

        var token = new JwtSecurityToken(
          issuer: _jwt.Issuer, 
          audience: _jwt.Audience, 
          claims: claims, 
          expires: DateTime.UtcNow.AddSeconds(30), 
          signingCredentials: creds 
         ); 

        return Ok(new 
        { 
         access_token = new JwtSecurityTokenHandler().WriteToken(token), 
         expiration = token.ValidTo 
        }); 
       } 
      } 
     } 
     catch (Exception) 
     { 

     } 

     return BadRequest("Failed to generate token."); 
    } 

कुछ मार्गदर्शन के लिए बहुत आभारी होंगे।

+0

कोड आप पोस्ट केवल पहुंच टोकन के सत्यापन के लिए प्रासंगिक है, टोकन ताज़ा नहीं:

बाद

खुश पथ के लिए छद्म कोड है। क्या आप उस कोड को साझा कर सकते हैं जहां आप एक्सेस टोकन उत्पन्न करते हैं? – naslund

+0

निश्चित रूप से, मैंने जेडब्ल्यूटी को उत्पन्न करने के लिए इस्तेमाल किया गया कोड जोड़ा है। – DJDJ

उत्तर

7

सबसे पहले आप इसे कहीं जारी रहती है एक ताज़ा टोकन उत्पन्न करने के लिए की जरूरत है और। ऐसा इसलिए है क्योंकि यदि आवश्यक हो तो आप इसे अमान्य कर सकते हैं। जहां सभी डेटा टोकन के भीतर निहित है - - आप पहुंच टोकन के रूप में एक ही पैटर्न का पालन करने के लिए गए थे अगर एक प्रतीक है कि गलत हाथों में समाप्त होता है ताज़ा टोकन के जीवन भर के लिए नया पहुंच टोकन को उत्पन्न करने के लिए इस्तेमाल किया जा सकता है, जो वास्तव में एक लंबा समय हो सकता है।

तो क्या बिल्ली आप जारी रहती है की जरूरत है? आपको कुछ प्रकार के अद्वितीय पहचानकर्ता की आवश्यकता है जो आसान अनुमान लगाने योग्य नहीं है, एक GUID ठीक काम करेगा। आपको एक नया एक्सेस टोकन जारी करने में सक्षम होने के लिए डेटा की भी आवश्यकता है, अधिकतर उपयोगकर्ता नाम। उपयोगकर्ता नाम रखने के बाद आप VerifyHashedPassword (...) को छोड़ सकते हैं - भाग लेकिन बाकी के लिए, बस उसी तर्क का पालन करें।

रीफ्रेश टोकन प्राप्त करने के लिए, आप आम तौर पर टोकन अनुरोध करते समय अपने मॉडल (CredentialViewModel) में प्रदान करते हैं, यह कुछ ऐसा है जो आप "ऑफ़लाइन_एक्ससी" का उपयोग करते हैं। सामान्य पहुंच टोकन अनुरोध के विपरीत, अब आपको अपना उपयोगकर्ता नाम और पासवर्ड प्रदान करने की आवश्यकता नहीं है, बल्कि इसके बजाय टोकन रीफ्रेश करें। रीफ्रेश टोकन के साथ अनुरोध प्राप्त करते समय, आप लगातार पहचानकर्ता को देखते हैं और उपयोगकर्ता के लिए टोकन जारी करते हैं।

[Route("Token")] 
[HttpPost] 
public async Task<IActionResult> CreateToken([FromBody] CredentialViewModel model) 
{ 
    if (model.GrantType is "refresh_token") 
    { 
     // Lookup which user is tied to model.RefreshToken 
     // Generate access token from the username (no password check required) 
     // Return the token (access + expiration) 
    } 
    else if (model.GrantType is "password") 
    { 
     if (model.Scopes contains "offline_access") 
     { 
      // Generate access token 
      // Generate refresh token (random GUID + model.username) 
      // Persist refresh token 
      // Return the complete token (access + refresh + expiration) 
     } 
     else 
     { 
      // Generate access token 
      // Return the token (access + expiration) 
     } 
    } 
} 
+0

आपके इनपुट के लिए धन्यवाद! – DJDJ

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