2016-02-17 26 views
8

Ho cercato di creare e firmare un JwtSecurityToken utilizzando una semplice chiave. E dopo molte ricerche sembra che tutti gli esempi che trovo utilizzino la classe InMemorySymmetricSecurityKey ma sfortunatamente questa classe non sembra esistere nelle versioni più recenti delle librerie System.IdentityModel.dnx451 RC1 Che cosa è successo a InMemorySymmetricSecurityKey?

Queste sono le dipendenze che sto usando:

"System.IdentityModel.Tokens": "5.0.0-rc1-211161024", 
"System.IdentityModel.Tokens.Jwt": "5.0.0-rc1-211161024" 

Ho anche provato ad utilizzare è classe base SymmetricSecurityKey ma poi ho la seguente eccezione quando si cerca di creare il token:

"Value cannot be null.\r\nParameter name: IDX10000: The parameter 'signatureProvider' cannot be a 'null' or an empty object." 

Questo è il codice che genera l'eccezione:

public static string CreateTokenHMAC() 
{ 
    HMACSHA256 hmac = new HMACSHA256(Convert.FromBase64String("test")); 

    var key = new SymmetricSecurityKey(hmac.Key); 

    var signingCredentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256Signature); 

    JwtSecurityToken token = _tokenHandler.CreateJwtSecurityToken(new SecurityTokenDescriptor() 
    { 
     Audience = AUDIENCE, 
     Issuer = ISSUER, 
     Expires = DateTime.UtcNow.AddHours(6), 
     NotBefore = DateTime.Now, 
     Claims = new List<Claim>() 
     { 
      new Claim(ClaimTypes.Email, "[email protected]") 
     }, 
     SigningCredentials = signingCredentials 
    }); 

    return _tokenHandler.WriteToken(token); 
} 

È la prima volta che utilizzo JwtSecurityToken, quindi suppongo che probabilmente manchi un passaggio da qualche parte

risposta

2

Sono riuscito a raggiungere la stessa identica eccezione. Ho lavorato tutto il problema generando la chiave in un altro modo:

RSAParameters keyParams; 
using (var rsa = new RSACryptoServiceProvider(2048)) 
{ 
    try 
    { 
     keyParams = rsa.ExportParameters(true); 
    } 
    finally 
    { 
     rsa.PersistKeyInCsp = false; 
    } 
} 
RsaSecurityKey key = new RsaSecurityKey(keyParams); 
var signingCredentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256Signature); 

Qui è un grande post su token-based authentication on ASP.NET 5 RC1 da Mark Hughes

+0

Grazie per la risposta :) –

3

Questo dovrebbe funzionare (notare che questo richiede che i pacchetti RC2 > 304.180.813)

var handler = new JwtSecurityTokenHandler(); 
var tokenDescriptor = new SecurityTokenDescriptor 
{ 
    Subject = new ClaimsIdentity(
     new Claim[] { new Claim(ClaimTypes.NameIdentifier, "bob") }), 
    SigningCredentials = new SigningCredentials(
     new SymmetricSecurityKey(new byte[256]), 
     SecurityAlgorithms.HmacSha256) 
}; 

var jwt = handler.CreateEncodedJwt(tokenDescriptor); 
4

Non sono riuscito a farlo funzionare utilizzando l'esempio RsaSecurityKey fornito nella risposta accettata, ma questo ha funzionato per me (utilizzando System.IdentityModel.Tokens.Jwt v5.1.3).

var signingKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes("test")); 
var signingCredentials = new SigningCredentials(signingKey, SecurityAlgorithms.HmacSha256); 

var securityTokenDescriptor = new SecurityTokenDescriptor() 
{ 
    Subject = new ClaimsIdentity(new List<Claim>() 
    { 
     new Claim(ClaimTypes.NameIdentifier, "[email protected]"), 
     new Claim(ClaimTypes.Role, "Administrator"), 
    }, "Custom"), 
    NotBefore = DateTime.Now, 
    SigningCredentials = signingCredentials, 
    Issuer = "self", 
    IssuedAt = DateTime.Now, 
    Expires = DateTime.Now.AddHours(3), 
    Audience = "http://my.website.com" 
}; 

var tokenHandler = new JwtSecurityTokenHandler(); 
var plainToken = tokenHandler.CreateToken(securityTokenDescriptor); 
var signedAndEncodedToken = tokenHandler.WriteToken(plainToken); 

e per verificare

var validationParameters = new TokenValidationParameters() 
{ 
    ValidateAudience = true, 
    ValidAudience = "http://my.website.com", 
    ValidateIssuer = true, 
    ValidIssuer = "self", 
    ValidateIssuerSigningKey = true, 
    IssuerSigningKey = signingKey, 
    RequireExpirationTime = true, 
    ValidateLifetime = true, 
    ClockSkew = TimeSpan.Zero 
}; 
try 
{ 
    SecurityToken mytoken = new JwtSecurityToken(); 
    var myTokenHandler = new JwtSecurityTokenHandler(); 
    var myPrincipal = myTokenHandler.ValidateToken(signedAndEncodedToken, validationParameters, out mytoken); 
} catch (Exception ex) 
{ 
    System.Diagnostics.Debug.WriteLine("Authentication failed"); 
}