2016-07-29 16 views
0

Ich möchte JWT-Token generieren, die von Google Firebase überprüft werden sollte. unter meinem Code ist jwt Token zu erzeugen, es funktioniert gut, bis ich Algorithmus ändern „RsaSha256Signature“ es gibt mir dann FehlerFehler beim Generieren von JWT Signaturalgorithmus wird nicht unterstützt

„Ausnahme:‚System.InvalidOperationException: Crypto-Algorithmus‘. http://www.w3.org/2001/04/xmldsig-more#rsa-sha256 'in diesem Zusammenhang nicht unterstützt “

Wenn ich es nicht ändern und es als „HmacSha256Signature“ es funktioniert gut

  var plainTextSecurityKey = "-----BEGIN PRIVATE KEY-----; 
      var signingKey = new InMemorySymmetricSecurityKey(Encoding.UTF8.GetBytes(plainTextSecurityKey)); 
      var signingCredentials = new SigningCredentials(signingKey, 
       SecurityAlgorithms.HmacSha256Signature, SecurityAlgorithms.Sha256Digest); 

      var claimsIdentity = new ClaimsIdentity(new List<Claim>() 
     { 
      new Claim(ClaimTypes.NameIdentifier, email), 
      new Claim(ClaimTypes.Role, role), 
     }, "Custom"); 

      var securityTokenDescriptor = new SecurityTokenDescriptor() 
      { 
       AppliesToAddress = "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit", 
       TokenIssuerName = "serviceemail", 
       Subject = claimsIdentity, 
       SigningCredentials = signingCredentials, 
      }; 

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

      var tokenValidationParameters = new TokenValidationParameters() 
      { 
       ValidAudiences = new string[] 
      { 
       "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit", 
       "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit" 
      }, 
       ValidIssuers = new string[] 
      { 
       "service email", 
       "service email" 
      }, 
       IssuerSigningKey = signingKey 
      }; 

      SecurityToken validatedToken; 
      tokenHandler.ValidateToken(signedAndEncodedToken, 
       tokenValidationParameters, out validatedToken); 

      return validatedToken.ToString(); 

Antwort

1

Ihr signingKeyist kein RSA-Schlüssel, so dass Sie nicht RsaSha256Signature verwenden können. HmacSha256Signature funktioniert, weil Sie einen HMAC symmetrischen Schlüssel mit einem festen Passwort

var plainTextSecurityKey = "-----BEGIN PRIVATE KEY-----; 
var signingKey = new InMemorySymmetricSecurityKey(Encoding.UTF8.GetBytes(plainTextSecurityKey)); 
var signingCredentials = new SigningCredentials(signingKey, SecurityAlgorithms.HmacSha256Signature, SecurityAlgorithms.Sha256Digest); 

Schaffung Ich bin kein Experte in C#, aber wahrscheinlich benötigen Sie so etwas wie this

// NOTE: Replace this with your actual RSA public/private keypair! 
var provider = new RSACryptoServiceProvider(2048); 
var parameters = provider.ExportParameters(true); 

// Build the credentials used to sign the JWT 
var signingKey = new RsaSecurityKey(parameters); 
var signingCredentials = new SigningCredentials(signingKey, SecurityAlgorithms.RsaSha256); 

Sie einen Schlüsselspeicher benötigen, die enthält Ihre privater und öffentlicher Schlüssel. Beachten Sie, dass HMAC ein symmetrischer Algorithmus ist und der Schlüssel zum Signieren und Verifizieren derselbe ist, aber RSA benötigt ein Schlüsselpaar