2015-04-04 11 views
6

Gram z JwtTokens i nie mogę ich poprawnie uruchomić. Używam do tego http://www.nuget.org/packages/System.IdentityModel.Tokens.Jwt/. Wiem, że kod jest bałagan, ale jest po prostu pokazać, co próbuję zrobić. Problem polega na tym, że chcę, aby JwtTokenHandler nie przeszedł walidacji ze względu na czas życia.Prawidłowe użycie JwtTokens w języku 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); 
} 

Czy to nie powinno zakończyć się niepowodzeniem, ponieważ czekam 2 sekundy? Nie powiedzie się, jeśli zmienię wystawcę parametru ValidationTokenParameter na "x" ...

+0

Zajrzyj na https://github.com/fvilers/WebApiOwinIdentityOAuthJwtSample w celu poprawnej implementacji. –

+0

@FabianVilers implementacja nie jest kompletna, sprawdzanie poprawności, które było tym programem, rzuca wyjątek. – dariogriffo

Odpowiedz

18

Znaleźliśmy problem. Parametry walidacji mają pochylać zegara domyślnego 5 minut

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

ustawienie, które do 0 tej pracy. Nadal nie rozumiem, dlaczego przekrzywienie wynosi 5 minut, jeśli ustawię wygaśnięcie w pewnym momencie !!!

+0

Uratowałeś mój dzień! – Mitklantekutli

+0

@ dariogriffo, @ Mitklantekutli Właściwie jak to ustawić na 0? Próbowałem jak tokenHandler.Configuration.MaxClockSkew = new TimeSpan (0, 0, 0); Ale nie działa. – PassionateProgrammer

+1

Ustawiłem właściwość ClockSkew w TokenValidationParameters, nie używam konfiguracji. Używam kodu var validationParameters = new TokenValidationParameters() { ... ClockSkew = new TimeSpan (0) }; – dariogriffo

Powiązane problemy