2015-04-04 13 views
6

Sto giocando a con JwtTokens e non riesco a farli funzionare correttamente. Sto usando http://www.nuget.org/packages/System.IdentityModel.Tokens.Jwt/ per questo. So che il codice è un disastro ma è solo per mostrare quello che sto cercando di fare. Il problema è che voglio che JwtTokenHandler fallisca la convalida a causa della durata.Uso corretto di JwtTokens in C#

var key = "5A0AB091-3F84-4EC4-B227-0834FCD8B1B4"; 
var domain = "http://localhost"; 
var allowedAudience = "http://localhost"; 
var signatureAlgorithm = "http://www.w3.org/2001/04/xmldsig-more#hmac-sha256"; 
var digestAlgorithm = "http://www.w3.org/2001/04/xmlenc#sha256"; 
var issuer = "self"; 
var securityKey = System.Text.Encoding.Unicode.GetBytes(key); 
var inMemorySymmetricSecurityKey = new InMemorySymmetricSecurityKey(securityKey); 

var now = DateTime.UtcNow; 
var expiry = now.AddSeconds(1); 
var tokenHandler = new JwtSecurityTokenHandler(); 
var claimsList = new List<Claim>() 
{ 
    new Claim(ClaimTypes.Name, "user"), 
    new Claim(ClaimTypes.Webpage, allowedAudience), 
    new Claim(ClaimTypes.Uri, domain),     
    new Claim(ClaimTypes.Expiration,expiry.Ticks.ToString()) 
}; 
var roles = new List<string>() { "admin" }; 
claimsList.AddRange(roles.Select(role => new Claim(ClaimTypes.Role, role))); 

var identity = new GenericIdentity("user"); 

var tokenDescriptor = new SecurityTokenDescriptor 
{ 
    Subject = new ClaimsIdentity(identity, claimsList), 
    TokenIssuerName = issuer, 
    AppliesToAddress = allowedAudience, 
    Lifetime = new Lifetime(now, expiry), 
    SigningCredentials = new SigningCredentials(inMemorySymmetricSecurityKey, signatureAlgorithm, digestAlgorithm), 
}; 

var token = tokenHandler.WriteToken(tokenHandler.CreateToken(tokenDescriptor)); 

var validationParameters = new TokenValidationParameters() 
{ 
    ValidIssuer = issuer, 
    ValidAudience = allowedAudience, 
    IssuerSigningToken = new BinarySecretSecurityToken(securityKey) 
}; 

Thread.Sleep(2000); 
try 
{ 
    SecurityToken securityToken; 
    tokenHandler.ValidateToken(token, validationParameters, out securityToken); 
    Console.WriteLine("OK"); 
} 
catch (Exception e) 
{ 
    Console.WriteLine("Error {0}", e.Message); 
} 

Non supponiamo che ciò non funzioni poiché attendo 2 secondi? Non riesce se cambio l'emittente del ValidationTokenParameter in "x" ...

+0

Dai un'occhiata a https://github.com/fvilers/WebApiOwinIdentityOAuthJwtSample per un'implementazione corretta. –

+0

@FabianVilers l'implementazione non è completa, la validazione che è stata l'isse sta generando un'eccezione. – dariogriffo

risposta

18

Trovato il problema. I parametri di convalida hanno un'asimmetria del clock di default di 5 minuti

/// <summary> 
/// Default for the clock skew. 
/// 
/// </summary> 
/// 
/// <remarks> 
/// 300 seconds (5 minutes). 
/// </remarks> 
public static readonly TimeSpan DefaultClockSkew; 

Impostazione che a 0 fare questo lavoro. Ancora non capisco perché l'obliquità è di 5 minuti, se entro un certo punto imposto la scadenza !!!

+0

Hai salvato la mia giornata! – Mitklantekutli

+0

@ dariogriffo, @ Mitklantekutli In realtà come l'hai impostato a 0? Ho provato questo come tokenHandler.Configuration.MaxClockSkew = new TimeSpan (0, 0, 0); Ma non funziona. – PassionateProgrammer

+1

Ho impostato la proprietà ClockSkew in TokenValidationParameters, non uso la configurazione. Io uso il codice validationParameters var = new TokenValidationParameters() { ... clockskew = new TimeSpan (0) }; – dariogriffo