Jun.Extensions.Jwt
2.5.4
dotnet add package Jun.Extensions.Jwt --version 2.5.4
NuGet\Install-Package Jun.Extensions.Jwt -Version 2.5.4
<PackageReference Include="Jun.Extensions.Jwt" Version="2.5.4" />
paket add Jun.Extensions.Jwt --version 2.5.4
#r "nuget: Jun.Extensions.Jwt, 2.5.4"
// Install Jun.Extensions.Jwt as a Cake Addin
#addin nuget:?package=Jun.Extensions.Jwt&version=2.5.4
// Install Jun.Extensions.Jwt as a Cake Tool
#tool nuget:?package=Jun.Extensions.Jwt&version=2.5.4
Jun.Extensions.Jwt
Some protocols are customized based on jwt. plaintext jwt, ciphertext jwe. Can be used for token authentication, data encryption and decryption transmission.
Examples
// simple payload
public class Payload
{
public long UserId { get; set; }
public string UserName { get; set; }
}
A simple sign/validation example
var secret = "1234567890123456";
var payload = new Payload()
{
UserId = 123456,
UserName = "Test",
};
// build
var token = GlobalUtil.Instance.JwtBuilder().SecretUtf8(secret).HeaderTyp().HeaderAlg(JwtSignAlgorithm.HS256).Build(payload);
// eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJVc2VySWQiOjEyMzQ1NiwiVXNlck5hbWUiOiJUZXN0In0.kBoqowtarOH2dpAdLrSRZOOy-Y2hRSc1w-Yh2h6IxRU
Console.WriteLine(token);
// validation
var validationResult = GlobalUtil.Instance.JwtValidation().SecretUtf8(secret).Validate(token, out Payload newPayload);
if (validationResult.ValidationStatus == JwtTokenValidationStatus.Success)
{
Console.WriteLine(payload.UserId == newPayload.UserId);
}
Standard example (recommend)
// init options.
void InitOption(JwtTokenBuilderMultiple bm, JwtTokenValidationMultiple vm)
{
// normal jwt
var builderOption1 = new JwtTokenBuilderMultipleOption()
{
Iss = "test",
Typ = JwtTokenBuilderHeaderTypes.JWT,
Alg = JwtSignAlgorithm.RS256,
Secret = "-- sign rsa private key for pkcs#1 or pkcs#8",
IsAutoIatExp = true,
Expire = TimeSpan.FromMinutes(30),
};
// 3 part jwe, payload is ciphertext
var builderOption2 = new JwtTokenBuilderMultipleOption()
{
Iss = "ciphertext",
Typ = JwtTokenBuilderHeaderTypes.JWE,
Alg = JwtSignAlgorithm.RS256,
Secret = "-- sign rsa private key for pkcs#1 or pkcs#8",
IsAutoIatExp = true,
Expire = TimeSpan.FromMinutes(30),
Enc = JwtEncryptionEncTypes.Aes256EcbPkcs7,
EncSecret = "123456789A123456", // fixed encrypt symmetric key
};
// 4 part jwe, symmetric key is random ciphertext, payload is ciphertext
var builderOption3 = new JwtTokenBuilderMultipleOption()
{
Iss = "random",
Typ = JwtTokenBuilderHeaderTypes.JWE,
Alg = JwtSignAlgorithm.RS256,
Secret = "-- sign rsa private key for pkcs#1 or pkcs#8",
IsAutoIatExp = true,
Expire = TimeSpan.FromMinutes(30),
Enc = JwtEncryptionEncTypes.Aes256EcbPkcs7,
PublicKey = "-- use the public key encrypt random symmetric key",
};
bm.AddOption(builderOption1);
bm.AddOption(builderOption2);
bm.AddOption(builderOption3);
var validationOption1 = new JwtTokenValidationMultipleOption()
{
Iss = "test",
Secret = "-- validation rsa public key", // pair with the same iss
ValidationFlags = JwtTokenValidationFlags.All, // check iat,exp
};
var validationOption2 = new JwtTokenValidationMultipleOption()
{
Iss = "ciphertext",
Secret = "-- validation rsa public key",
ValidationFlags = JwtTokenValidationFlags.All,
EncSecret = "123456789A123456", // fixed symmetric key, the same as builder
};
var validationOption3 = new JwtTokenValidationMultipleOption()
{
Iss = "random",
Secret = "-- validation rsa public key",
ValidationFlags = JwtTokenValidationFlags.All,
PrivateKey = "-- use the private key decrypt random symmetric key",
};
vm.AddOption(validationOption1);
vm.AddOption(validationOption2);
vm.AddOption(validationOption3);
}
var payload = new Payload()
{
UserId = 123456,
UserName = "Test",
};
// create multiple builder/validation
var bm = GlobalUtil.Instance.JwtBuilderMultiple();
var vm = GlobalUtil.Instance.JwtValidationMultiple();
InitOption(bm, vm);
// build from random iss
var iss = bm.RandomIss(new string[] { "test", "ciphertext", "random" });
var token = bm.Build(iss, payload);
Console.WriteLine(token);
// validation
var validationResult = vm.Validate(token, out Payload newPayload);
if (validationResult.ValidationStatus == JwtTokenValidationStatus.Success)
{
Console.WriteLine(payload.UserId == newPayload.UserId);
}
Protocols
HEADER add iss
, pair with build/validation.
- 3 part jwt = jwt.io Encode/Decode
- 3 part jwe (header.ciphertext.signature)
HEADER
typ
isJWE
,enc
isAES_256_ECB_PKCS7
AES_192_ECB_PKCS7
AES_128_ECB_PKCS7
. can use jwt.io Decode, but payload is ciphertext.
- 4 part jwe (header.enc_secret.ciphertext.signature)
HEADER
typ
isJWE
,enc
isAES_256_ECB_PKCS7
AES_192_ECB_PKCS7
AES_128_ECB_PKCS7
. can't use jwt.io Decode, 2part(enc secret) 3part(payload) both ciphertext.
Supported Signing/Validation
- ✔ HS256
- ✔ HS384
- ✔ HS512
- ✔ RS256
- ✔ RS384
- ✔ RS512
- ✔ ES256
- ✔ ES384
- ✔ ES512
- ❌ PS256
- ❌ PS384
- ❌ PS512
everything to jwt ^_^
Pairing jun-extensions-jwt.js
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- Jun.Common (>= 2.3.4)
- Jun.Extensions.Security (>= 2.2.2)
- Newtonsoft.Json (>= 13.0.3)
NuGet packages (1)
Showing the top 1 NuGet packages that depend on Jun.Extensions.Jwt:
Package | Downloads |
---|---|
Jun.Extensions.CoreApi
core api extensions |
GitHub repositories
This package is not used by any popular GitHub repositories.