/// <summary>
 /// Initializes a new instance of the JsonWebToken class, initializes claims from raw values
 /// </summary>
 /// <param name="issuerPrincipalId">Service principal id of the issuer.</param>
 /// <param name="tenantRealm">Realm or context id of the tenant.</param>
 /// <param name="audienceHostName">Audience host name.</param>
 /// <param name="audiencePrincipalId">Principal id of the protected resource.</param>
 /// <param name="nbfTime">DateTime of the NotBefore claim.</param>
 /// <param name="validityInSeconds">Validity of the token in seconds.</param>
 public JsonWebToken(
     string issuerPrincipalId,
     string tenantRealm,
     string audienceHostName,
     string audiencePrincipalId,
     DateTime nbfTime,
     long validityInSeconds) : this()
 {
     this.Issuer             = JWTTokenHelper.GetFormattedPrincipal(issuerPrincipalId, string.Empty, tenantRealm);
     this.Audience           = JWTTokenHelper.GetFormattedPrincipal(audiencePrincipalId, audienceHostName, tenantRealm);
     this.NotBeforeDateTime  = nbfTime;
     this.ExpirationDateTime = DateTime.Now.ToUniversalTime().AddSeconds(validityInSeconds);
 }
        /// <summary>
        /// Generates a JWT token for the given tenant, scope
        /// </summary>
        /// <param name="issuerPrincipalId">Issuer App principal id.</param>
        /// <param name="tenantRealm">Tenant context id.</param>
        /// <param name="audienceHostName">Service host name</param>
        /// <param name="audiencePrincipalId">Principal id of the protected resource or audience</param>
        /// <param name="nbfTime">Not valid before time.</param>
        /// <param name="validityInSeconds">Token validity duration.</param>
        /// <returns>A JWT token initialized with the basic claims.</returns>
        public static JsonWebToken GenerateSelfSignedToken(
            string issuerPrincipalId,
            string tenantRealm,
            string audienceHostName,
            string audiencePrincipalId,
            DateTime nbfTime,
            long validityInSeconds)
        {
            string   issuer         = JWTTokenHelper.GetFormattedPrincipal(issuerPrincipalId, string.Empty, tenantRealm);
            string   audience       = JWTTokenHelper.GetFormattedPrincipal(audiencePrincipalId, audienceHostName, tenantRealm);
            DateTime expirationTime = DateTime.Now.ToUniversalTime().AddSeconds(validityInSeconds);

            return(new JsonWebToken(issuer, audience, nbfTime, expirationTime));
        }