Create and Sign a JSON Web Token (JWT) with C# and .Net
.Net comes with handy tools to deal with JWT Tokens. Just add the following Microsoft packages as dependencies of your .Net project:
- Microsoft.IdentityModel.Tokens
- System.IdentityModel.Tokens.Jwt
using System; using System.IO; using System.Security.Cryptography; using System.IdentityModel.Tokens.Jwt; using Microsoft.IdentityModel.Tokens; using System.Security.Claims; namespace AaaSDocumentation { class SignToken { static void Main(string[] args) { try { // reading the content of a private key PEM file, PKCS8 encoded string privateKeyPem = File.ReadAllText("..."); // keeping only the payload of the key privateKeyPem = privateKeyPem.Replace("-----BEGIN PRIVATE KEY-----", ""); privateKeyPem = privateKeyPem.Replace("-----END PRIVATE KEY-----", ""); byte[] privateKeyRaw = Convert.FromBase64String(privateKeyPem); // creating the RSA key RSACryptoServiceProvider provider = new RSACryptoServiceProvider(); provider.ImportPkcs8PrivateKey(new ReadOnlySpan<byte>(privateKeyRaw), out _); RsaSecurityKey rsaSecurityKey = new RsaSecurityKey(provider); // Generating the token var now = DateTime.UtcNow; var claims = new[] { new Claim(JwtRegisteredClaimNames.Sub, "YOUR_CLIENTID"), new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()) }; var handler = new JwtSecurityTokenHandler(); var token = new JwtSecurityToken ( "YOUR_CLIENTID", "https://AAAS_PLATFORM/idp/YOUR_TENANT/authn/token", claims, now.AddMilliseconds(-30), now.AddMinutes(60), new SigningCredentials(rsaSecurityKey, SecurityAlgorithms.RsaSha256) ); // handler.WriteToken(token) returns the token ready to send to AaaS ! Console.WriteLine( handler.WriteToken(token) ); } catch (Exception e) { Console.WriteLine(e.ToString()); Console.WriteLine( new System.Diagnostics.StackTrace().ToString() ); } } } }