2016-02-17 10 views
8

Ich habe versucht, ein JwtSecurityToken mit einem einfachen Schlüssel zu erstellen und zu signieren. Und nach vielen Nachforschungen scheint es, dass alle Beispiele, die ich finde, die InMemorySymmetricSecurityKey Klasse verwenden, aber diese Klasse scheint in den neuesten Versionen der System.IdentityModel Bibliotheken nicht zu existieren.dnx451 RC1 Was ist mit InMemorySymmetricSecurityKey passiert?

Dies sind die Abhängigkeiten Ich verwende:

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

Ich habe auch versucht Basisklasse SymmetricSecurityKey es verwenden, aber dann bekomme ich die folgende Ausnahme bei dem Versuch, den Token zu erstellen:

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

Diese ist der Code, der die Ausnahme auslöst:

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

Es ist das erste Mal, dass ich JwtSecurityToken benutze, also denke ich, dass ich wahrscheinlich irgendwo einen Schritt verpasse

Antwort

2

Ich schaffte es, genau die gleiche Ausnahme zu erreichen. Ich arbeitete, um das Problem durch den Schlüssel eine andere Art und Weise zu erzeugen:

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

Hier ist ein großer Beitrag über token-based authentication on ASP.NET 5 RC1 von Mark Hughes

+0

Vielen Dank für Ihre Antwort zu überprüfen :) –

3

Dies sollte funktionieren (beachten Sie diese RC2-Pakete > 304.180.813 erfordert)

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

Ich konnte es nicht mit dem RsaSecurityKey-Beispiel, das in der angenommenen Antwort enthalten ist, zum Laufen bringen, aber das funktionierte für mich (mit 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); 

und

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