2016-07-12 14 views
1

Ich versuche, die Firebase-Auth auf einer Website (C#) zu tun. Ich muss das Token für die Anmeldung validieren.C# JWT Verifikation

Ich bekomme das Token in Ordnung, und wenn ich https://jwt.io/ mit dem Token und dem öffentlichen Schlüssel aus dem Token gehe, gibt es zurück, dass die Signatur gültig ist.

Mein Problem ist, dass ich nicht herausfinden kann, wie man das Token in C# validiert.

Ich habe den folgenden Code, den ich in das Token und den öffentlichen Schlüssel (ohne das --- BEGIN-Zertifikat und Ende cert--) senden.

Ich erhalte eine Fehlermeldung von Bad Sequenz: 3 Parametername: seq

ich für die Krypto-Hüpfburg bin mit. Ich habe keine Ahnung, wo ich falsch liege. Alles, was ich versucht habe zu verifizieren, hat nicht funktioniert.

Ich wäre dankbar für jede Hilfe.

Vielen Dank.

public static string Decode(string token,string key, bool verify = true) 
    { 
     // HttpContext.Current.Response.Write(key); 
     // HttpContext.Current.Response.End(); 
     string[] parts = token.Split('.'); 
     string header = parts[0]; 
     string payload = parts[1]; 
     byte[] crypto = Base64UrlDecode(parts[2]); 

     string headerJson = Encoding.UTF8.GetString(Base64UrlDecode(header)); 
     JObject headerData = JObject.Parse(headerJson); 

     string payloadJson = Encoding.UTF8.GetString(Base64UrlDecode(payload)); 
     JObject payloadData = JObject.Parse(payloadJson); 

     if (verify) 
     { 
      var keyBytes = Convert.FromBase64String(key); // your key here 

      AsymmetricKeyParameter asymmetricKeyParameter = PublicKeyFactory.CreateKey(keyBytes); 
      RsaKeyParameters rsaKeyParameters = (RsaKeyParameters)asymmetricKeyParameter; 
      RSAParameters rsaParameters = new RSAParameters(); 
      rsaParameters.Modulus = rsaKeyParameters.Modulus.ToByteArrayUnsigned(); 
      rsaParameters.Exponent = rsaKeyParameters.Exponent.ToByteArrayUnsigned(); 
      RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); 
      rsa.ImportParameters(rsaParameters); 

      SHA256 sha256 = SHA256.Create(); 
      byte[] hash = sha256.ComputeHash(Encoding.UTF8.GetBytes(parts[0] + '.' + parts[1])); 

      RSAPKCS1SignatureDeformatter rsaDeformatter = new RSAPKCS1SignatureDeformatter(rsa); 
      rsaDeformatter.SetHashAlgorithm("SHA256"); 
      if (!rsaDeformatter.VerifySignature(hash, FromBase64Url(parts[2]))) 
       throw new ApplicationException(string.Format("Invalid signature")); 
     } 

     return payloadData.ToString(); 
    } 

    private static byte[] FromBase64Url(string base64Url) 
    { 
     string padded = base64Url.Length % 4 == 0 
      ? base64Url : base64Url + "====".Substring(base64Url.Length % 4); 
     string base64 = padded.Replace("_", "/") 
           .Replace("-", "+"); 
     return Convert.FromBase64String(base64); 
    } 

    // from JWT spec 
    private static byte[] Base64UrlDecode(string input) 
    { 
     var output = input; 
     output = output.Replace('-', '+'); // 62nd char of encoding 
     output = output.Replace('_', '/'); // 63rd char of encoding 
     switch (output.Length % 4) // Pad with trailing '='s 
     { 
      case 0: break; // No pad chars in this case 
      case 1: output += "==="; break; // Three pad chars 
      case 2: output += "=="; break; // Two pad chars 
      case 3: output += "="; break; // One pad char 
      default: throw new System.Exception("Illegal base64url string!"); 
     } 
     var converted = Convert.FromBase64String(output); // Standard base64 decoder 
     return converted; 
    } 
+0

Warum möchten Sie das selbst kochen? Es gibt reife Bibliotheken für den Umgang mit JWT. Entweder [Open Source] (https://github.com/jwt-dotnet/jwt) oder [msoft] (https://msdn.microsoft.com/en-us/library/system.identitymodel.tokens.jwtsecuritytokenhandler%28v = vs.114% 29.aspx? f = 255 & MSPPError = -2147217396). – bbsimonbb

Antwort

0

Es gibt sehr gute vordefinierte Bibliotheken in .NET, um JWT in der Anwendung zu unterstützen. System.IdentityModel.Tokens.Jwt und Microsoft.IdentityModel.Tokens hat ziemlich nützliche Sachen. Ich habe kürzlich die Erstellung und Authentifizierung von JWT-Token in der WebAPI-Anwendung implementiert. Ich schrieb dies, um JWT zu validieren.

Sie müssen die oben genannten Stringdetails mit gültigen Details gemäß Ihrer Anwendung aktualisieren, die zum Erstellen von JWT verwendet werden. Ich teile auch den Code, den ich geschrieben habe, um JWT von AuthenticationTicket zu erstellen. Ich hoffe, es wird helfen.

using System; 
using System.IdentityModel.Tokens.Jwt; 
using System.Text; 
using Microsoft.IdentityModel.Tokens; 
using Microsoft.Owin.Security; 

public class JwtTokenFormatter : ISecureDataFormat<AuthenticationTicket> 
    { 
     private readonly JwtSecurityTokenHandler _tokenHandler; 
     public JwtTokenFormatter() 
     { 
      _tokenHandler = new JwtSecurityTokenHandler(); 

     } 
     public string Protect(AuthenticationTicket data) 
     { 
      var tokenDescriptor = new SecurityTokenDescriptor 
      { 
       Audience = "ValidTokenAudienceName", 
       Issuer = "ValidTokenIssuerName", 
       IssuedAt = DateTime.UtcNow, 
       NotBefore = DateTime.UtcNow, 
       Expires = DateTime.UtcNow.AddHours(24), 
       Subject = data.Identity, 
       SigningCredentials = 
        new SigningCredentials(
         new SymmetricSecurityKey(Encoding.Default.GetBytes("ValidTokenSigningKey")), 
         SecurityAlgorithms.HmacSha256Signature) 
      }; 

      return _tokenHandler.CreateEncodedJwt(tokenDescriptor); 
     } 

     public AuthenticationTicket Unprotect(string protectedText) 
     { 
      throw new NotImplementedException(); 
     } 
    } 
+0

verwenden Sie einen symmetrischen Schlüssel. Es gibt viele Beispiele für symmetrische Schlüssel, aber die Frage von @ chiefBacon lautet AsymmetricKey –