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