2using System.Globalization;
3using System.IdentityModel.Tokens.Jwt;
4using System.Security.Claims;
6using System.Threading.Tasks;
8using Microsoft.Extensions.Options;
9using Microsoft.IdentityModel.Tokens;
45 IOptions<SecurityConfiguration> securityConfigurationOptions)
49 ArgumentNullException.ThrowIfNull(cryptographySuite);
50 ArgumentNullException.ThrowIfNull(assemblyInformationProvider);
52 securityConfiguration = securityConfigurationOptions?.Value ??
throw new ArgumentNullException(nameof(securityConfigurationOptions));
60 ValidateIssuerSigningKey =
true,
61 IssuerSigningKey =
new SymmetricSecurityKey(signingKeyBytes),
63 ValidateIssuer =
true,
64 ValidIssuer = assemblyInformationProvider.
AssemblyName.Name,
66 ValidateLifetime =
true,
67 ValidateAudience =
true,
68 ValidAudience = typeof(
TokenResponse).Assembly.GetName().Name,
72 RequireSignedTokens =
true,
74 RequireExpirationTime =
true,
79 public async Task<TokenResponse>
CreateToken(Models.User user,
bool oAuth, CancellationToken cancellationToken)
81 ArgumentNullException.ThrowIfNull(user);
83 var now = DateTimeOffset.UtcNow;
84 var nowUnix = now.ToUnixTimeSeconds();
91 var lpuUnix = user.LastPasswordUpdate?.ToUnixTimeSeconds();
92 if (nowUnix == lpuUnix)
95 var expiry = now.AddMinutes(oAuth
98 var claims =
new Claim[]
100 new Claim(JwtRegisteredClaimNames.Sub, user.Id.Value.ToString(CultureInfo.InvariantCulture)),
101 new Claim(JwtRegisteredClaimNames.Exp, expiry.ToUnixTimeSeconds().ToString(CultureInfo.InvariantCulture)),
102 new Claim(JwtRegisteredClaimNames.Nbf, nowUnix.ToString(CultureInfo.InvariantCulture)),
107 var token =
new JwtSecurityToken(
new JwtHeader(
new SigningCredentials(
ValidationParameters.IssuerSigningKey, SecurityAlgorithms.HmacSha256)),
new JwtPayload(claims));
110 Bearer =
new JwtSecurityTokenHandler().WriteToken(token),
Represents a JWT returned by the API.
Configuration options pertaining to user security.
string CustomTokenSigningKeyBase64
A custom token signing key. Overrides TokenSigningKeyByteCount.
uint TokenSigningKeyByteCount
Amount of bytes to use in the Microsoft.IdentityModel.Tokens.TokenValidationParameters....
uint TokenClockSkewMinutes
Amount of minutes to skew the clock for Api.Models.Response.TokenResponse validation.
uint OAuthTokenExpiryMinutes
Amount of minutes until Api.Models.Response.TokenResponses generated from OAuth logins expire.
uint TokenExpiryMinutes
Amount of minutes until Api.Models.Response.TokenResponses generated from passwords expire.
async Task< TokenResponse > CreateToken(Models.User user, bool oAuth, CancellationToken cancellationToken)
Create a TokenResponse for a given user . A Task<TResult> resulting in a new TokenResponse.
TokenValidationParameters ValidationParameters
The TokenValidationParameters for the ITokenFactory.
TokenFactory(IAsyncDelayer asyncDelayer, ICryptographySuite cryptographySuite, IAssemblyInformationProvider assemblyInformationProvider, IOptions< SecurityConfiguration > securityConfigurationOptions)
Initializes a new instance of the TokenFactory class.
readonly SecurityConfiguration securityConfiguration
The SecurityConfiguration for the TokenFactory.
readonly IAsyncDelayer asyncDelayer
The IAsyncDelayer for the TokenFactory.
Contains various cryptographic functions.
byte[] GetSecureBytes(uint amount)
Generates a secure set of bytes.
For creating TokenResponses.
For waiting asynchronously.
Task Delay(TimeSpan timeSpan, CancellationToken cancellationToken)
Create a Task that completes after a given timeSpan .