2023-01-13 21:55:08 +00:00
|
|
|
using System.IdentityModel.Tokens.Jwt;
|
2023-01-01 21:54:07 +00:00
|
|
|
using System.Text;
|
|
|
|
|
using Microsoft.AspNetCore.Authentication.JwtBearer;
|
|
|
|
|
using Microsoft.IdentityModel.Tokens;
|
|
|
|
|
|
|
|
|
|
namespace Elsa.Identity.Options;
|
|
|
|
|
|
|
|
|
|
public class IdentityTokenOptions
|
|
|
|
|
{
|
|
|
|
|
public string SigningKey { get; set; }
|
|
|
|
|
public string Issuer { get; set; } = "http://elsa.api";
|
|
|
|
|
public string Audience { get; set; } = "http://elsa.api";
|
2023-01-13 21:55:08 +00:00
|
|
|
public TimeSpan AccessTokenLifetime { get; set; } = TimeSpan.FromHours(1);
|
|
|
|
|
public TimeSpan RefreshTokenLifetime { get; set; } = TimeSpan.FromHours(2);
|
2023-01-01 21:54:07 +00:00
|
|
|
|
|
|
|
|
public SecurityKey CreateSecurityKey() => new SymmetricSecurityKey(Encoding.ASCII.GetBytes(SigningKey));
|
|
|
|
|
|
|
|
|
|
public void ConfigureJwtBearerOptions(JwtBearerOptions options) =>
|
|
|
|
|
options.TokenValidationParameters = new TokenValidationParameters
|
|
|
|
|
{
|
|
|
|
|
IssuerSigningKey = CreateSecurityKey(),
|
|
|
|
|
ValidAudience = Audience,
|
2023-01-13 21:55:08 +00:00
|
|
|
ValidIssuer = Issuer,
|
|
|
|
|
ValidateLifetime = true,
|
|
|
|
|
LifetimeValidator = ValidateLifetime,
|
|
|
|
|
NameClaimType = JwtRegisteredClaimNames.Name
|
2023-01-01 21:54:07 +00:00
|
|
|
};
|
|
|
|
|
|
2023-01-13 21:55:08 +00:00
|
|
|
private bool ValidateLifetime(DateTime? notBefore, DateTime? expires, SecurityToken securityToken, TokenValidationParameters validationParameters)
|
|
|
|
|
{
|
|
|
|
|
return expires != null && expires > DateTime.UtcNow;
|
|
|
|
|
}
|
|
|
|
|
|
2023-01-01 21:54:07 +00:00
|
|
|
/// <summary>
|
|
|
|
|
/// Deconstructor.
|
|
|
|
|
/// </summary>
|
2023-01-13 21:55:08 +00:00
|
|
|
internal void Deconstruct(out string signingKey, out string issuer, out string audience, out TimeSpan accessTokenLifetime, out TimeSpan refreshTokenLifetime)
|
2023-01-01 21:54:07 +00:00
|
|
|
{
|
|
|
|
|
signingKey = SigningKey;
|
|
|
|
|
issuer = Issuer;
|
|
|
|
|
audience = Audience;
|
2023-01-13 21:55:08 +00:00
|
|
|
accessTokenLifetime = AccessTokenLifetime;
|
|
|
|
|
refreshTokenLifetime = RefreshTokenLifetime;
|
2023-01-01 21:54:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
internal void CopyFrom(IdentityTokenOptions identityOptions)
|
|
|
|
|
{
|
|
|
|
|
SigningKey = identityOptions.SigningKey;
|
|
|
|
|
Audience = identityOptions.Audience;
|
|
|
|
|
Issuer = identityOptions.Issuer;
|
2023-01-13 21:55:08 +00:00
|
|
|
AccessTokenLifetime = identityOptions.AccessTokenLifetime;
|
|
|
|
|
RefreshTokenLifetime = identityOptions.RefreshTokenLifetime;
|
2023-01-01 21:54:07 +00:00
|
|
|
}
|
|
|
|
|
}
|