using Microsoft.IdentityModel.Tokens; using System; using System.Threading.Tasks; namespace Knoks.Api.Authentication { public class JwtIssuerOptions { /// /// "iss" (Issuer) Claim /// /// The "iss" (issuer) claim identifies the principal that issued the /// JWT. The processing of this claim is generally application specific. /// The "iss" value is a case-sensitive string containing a StringOrURI /// value. Use of this claim is OPTIONAL. public string Issuer { get; set; } /// /// "sub" (Subject) Claim /// /// The "sub" (subject) claim identifies the principal that is the /// subject of the JWT. The claims in a JWT are normally statements /// about the subject. The subject value MUST either be scoped to be /// locally unique in the context of the issuer or be globally unique. /// The processing of this claim is generally application specific. The /// "sub" value is a case-sensitive string containing a StringOrURI /// value. Use of this claim is OPTIONAL. public string Subject { get; set; } /// /// "aud" (Audience) Claim /// /// The "aud" (audience) claim identifies the recipients that the JWT is /// intended for. Each principal intended to process the JWT MUST /// identify itself with a value in the audience claim. If the principal /// processing the claim does not identify itself with a value in the /// "aud" claim when this claim is present, then the JWT MUST be /// rejected. In the general case, the "aud" value is an array of case- /// sensitive strings, each containing a StringOrURI value. In the /// special case when the JWT has one audience, the "aud" value MAY be a /// single case-sensitive string containing a StringOrURI value. The /// interpretation of audience values is generally application specific. /// Use of this claim is OPTIONAL. public string Audience { get; set; } /// /// "nbf" (Not Before) Claim (default is UTC NOW) /// /// The "nbf" (not before) claim identifies the time before which the JWT /// MUST NOT be accepted for processing. The processing of the "nbf" /// claim requires that the current date/time MUST be after or equal to /// the not-before date/time listed in the "nbf" claim. Implementers MAY /// provide for some small leeway, usually no more than a few minutes, to /// account for clock skew. Its value MUST be a number containing a /// NumericDate value. Use of this claim is OPTIONAL. public DateTime NotBefore => DateTime.UtcNow; /// /// "iat" (Issued At) Claim (default is UTC NOW) /// /// The "iat" (issued at) claim identifies the time at which the JWT was /// issued. This claim can be used to determine the age of the JWT. Its /// value MUST be a number containing a NumericDate value. Use of this /// claim is OPTIONAL. public DateTime IssuedAt => DateTime.UtcNow; /// /// Set the timespan the token will be valid for (default is 5 min/300 seconds) /// public TimeSpan ValidFor { get; set; } = TimeSpan.FromMinutes(5); /// /// "exp" (Expiration Time) Claim (returns IssuedAt + ValidFor) /// /// The "exp" (expiration time) claim identifies the expiration time on /// or after which the JWT MUST NOT be accepted for processing. The /// processing of the "exp" claim requires that the current date/time /// MUST be before the expiration date/time listed in the "exp" claim. /// Implementers MAY provide for some small leeway, usually no more than /// a few minutes, to account for clock skew. Its value MUST be a number /// containing a NumericDate value. Use of this claim is OPTIONAL. public DateTime Expiration => IssuedAt.Add(ValidFor); /// /// "jti" (JWT ID) Claim (default ID is a GUID) /// /// The "jti" (JWT ID) claim provides a unique identifier for the JWT. /// The identifier value MUST be assigned in a manner that ensures that /// there is a negligible probability that the same value will be /// accidentally assigned to a different data object; if the application /// uses multiple issuers, collisions MUST be prevented among values /// produced by different issuers as well. The "jti" claim can be used /// to prevent the JWT from being replayed. The "jti" value is a case- /// sensitive string. Use of this claim is OPTIONAL. public Func> JtiGenerator => () => Task.FromResult(Guid.NewGuid().ToString()); /// /// The signing key to use when generating tokens. /// public SigningCredentials SigningCredentials { get; set; } } }