Skip to content

Instantly share code, notes, and snippets.

@chgeuer
Last active October 21, 2020 10:14
Show Gist options
  • Save chgeuer/fccf4f77aa93de54f7305d5e7d6cbbf0 to your computer and use it in GitHub Desktop.
Save chgeuer/fccf4f77aa93de54f7305d5e7d6cbbf0 to your computer and use it in GitHub Desktop.
namespace JoseJwtTester
{
using System;
using System.Text.Json;
using System.Text.Json.Serialization;
using Jose; // <PackageReference Include="jose-jwt" Version="2.6.0" />
public class ApplicationCreationRequest
{
[JsonPropertyName("tenantId")]
public string TenantId { get; set; }
[JsonPropertyName("subscriptionId")]
public Guid SubscriptionId { get; set; }
[JsonPropertyName("timeStamp")]
public DateTimeOffset TimeStamp { get; set; }
public override string ToString() => $"{nameof(ApplicationCreationRequest)} {this.TenantId} {this.SubscriptionId} {this.TimeStamp}";
}
public enum SignatureValidity { Invalid = 0, Valid = 1 }
class Program
{
public static string SignRequest<T>(string signingKey, T request)
{
var secretKey = Convert.FromBase64String(signingKey);
var payloadString = JsonSerializer.Serialize(request);
return JWT.Encode(payloadString, secretKey, JwsAlgorithm.HS512);
}
public static (SignatureValidity, T) ValidateRequest<T>(string verificationKey, string token)
{
var secretKey = Convert.FromBase64String(verificationKey);
try
{
var json = JWT.Decode(token, secretKey);
var req = JsonSerializer.Deserialize<T>(json);
return (SignatureValidity.Valid, req);
}
catch (IntegrityException)
{
return (SignatureValidity.Invalid, default(T));
}
}
static void Main(string[] args)
{
var signingKey = "pDzCAKG9KSaCWY2kLaqf0UWJ89i/gy/6IGvndSWe4eo=";
var request = new ApplicationCreationRequest
{
SubscriptionId = Guid.Parse("fb7fdc26-b0e5-45b6-8119-7bc48bc12e4e"),
TenantId = "chgeuerfte.onmicrosoft.com",
TimeStamp = DateTimeOffset.UtcNow
};
string token = SignRequest(signingKey, request);
Console.WriteLine(token);
bool noTampering = true;
var validationKey = noTampering ? signingKey : "aDzCAKG9KSaCWY2kLaqf0UWJ89i/gy/6IGvndSWe4eo=";
switch (ValidateRequest<ApplicationCreationRequest>(validationKey, token))
{
case (SignatureValidity.Valid, var r):
Console.WriteLine(r);
break;
case (SignatureValidity.Invalid, _):
Console.Error.WriteLine("Invalid request");
break;
}
FunctionalOverload();
}
#region A bit too much lambda
public static Func<T, string> RequestSigner<T>(string signingKey)
{
var secretKey = Convert.FromBase64String(signingKey);
return (T request) =>
{
var payloadString = JsonSerializer.Serialize(request);
return JWT.Encode(payloadString, secretKey, JwsAlgorithm.HS512);
};
}
public static Func<string, (SignatureValidity, T)> RequestVerifier<T>(string verificationKey)
{
var secretKey = Convert.FromBase64String(verificationKey);
return (string token) =>
{
try
{
var json = JWT.Decode(token, secretKey);
var req = JsonSerializer.Deserialize<T>(json);
return (SignatureValidity.Valid, req);
}
catch (IntegrityException)
{
return (SignatureValidity.Invalid, default(T));
}
};
}
static void FunctionalOverload()
{
var signingKey = "pDzCAKG9KSaCWY2kLaqf0UWJ89i/gy/6IGvndSWe4eo=";
var request = new ApplicationCreationRequest
{
SubscriptionId = Guid.Parse("fb7fdc26-b0e5-45b6-8119-7bc48bc12e4e"),
TenantId = "chgeuerfte.onmicrosoft.com",
TimeStamp = DateTimeOffset.UtcNow
};
string token = RequestSigner<ApplicationCreationRequest>(signingKey)(request);
Console.WriteLine(token);
bool noTampering = true;
var validationKey = noTampering ? signingKey : "aDzCAKG9KSaCWY2kLaqf0UWJ89i/gy/6IGvndSWe4eo=";
switch (RequestVerifier<ApplicationCreationRequest>(validationKey)(token))
{
case (SignatureValidity.Valid, var r):
Console.WriteLine(r);
break;
case (SignatureValidity.Invalid, _):
Console.Error.WriteLine("Invalid request");
break;
}
}
#endregion
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment