using System;
using System.Configuration;
using System.IdentityModel.Tokens;
using System.Security.Claims;
using System.ServiceModel.Security.Tokens;
using Newtonsoft.Json;
namespace iiie.Authentication.Business.JWT
{
///
/// Token creation class
///
public static class TokenManager
{
///
/// Create signing credentials to sign the token
///
/// The credentials
private static SigningCredentials CreateSigningCredentials()
{
string symmetricKey = ConfigurationManager.AppSettings["CredentialKey"];
byte[] keybytes = Convert.FromBase64String(symmetricKey);
SecurityKey securityKey = new InMemorySymmetricSecurityKey(keybytes);
SigningCredentials signingCredentials =
new SigningCredentials(securityKey,
SecurityAlgorithms.HmacSha256Signature,
SecurityAlgorithms.Sha256Digest);
return signingCredentials;
}
///
/// Create a JWT token
///
/// The user username
/// The user salt
/// Additionnal user data
/// The token
public static string GetToken(string username, string salt, object data = null)
{
var stringValidator = ConfigurationManager.AppSettings["StringValidator"];
JwtSecurityToken jst = new JwtSecurityToken("urn:" + stringValidator,
stringValidator,
new []
{
new Claim(ClaimTypes.Name, username),
new Claim(ClaimTypes.Authentication, salt),
new Claim(ClaimTypes.UserData, JsonConvert.SerializeObject(data))
}, null, DateTime.Now.AddDays(1),
CreateSigningCredentials());
JwtSecurityTokenHandler jh = new JwtSecurityTokenHandler();
return jh.WriteToken(jst);
}
public static ClaimsPrincipal ParseToken(string token)
{
JwtSecurityTokenHandler tokenHandler = new JwtSecurityTokenHandler
{
Configuration = new SecurityTokenHandlerConfiguration()
{
MaxClockSkew = new TimeSpan(0, 1, 0)
}
};
var stringValidator = ConfigurationManager.AppSettings["StringValidator"];
TokenValidationParameters validationParameters = new TokenValidationParameters()
{
RequireSignedTokens = true,
RequireExpirationTime = true,
ValidAudience = stringValidator,
ValidateIssuerSigningKey = true,
ValidIssuer = "urn:" + stringValidator,
IssuerSigningToken = new BinarySecretSecurityToken(Convert.FromBase64String(ConfigurationManager.AppSettings["CredentialKey"]))
};
SecurityToken validateToken;
return tokenHandler.ValidateToken(token, validationParameters, out validateToken);
}
}
}