using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using System.Text.Json; using FoodsharingSiegen.Contracts.Entity; using FoodsharingSiegen.Contracts.Helper; using Microsoft.IdentityModel.Tokens; namespace FoodsharingSiegen.Shared.Helper { /// /// The auth helper class (a. beging, 04.04.2022) /// public static class AuthHelper { #region Public Method CreateToken /// /// Creates the token using the specified user id (a. beging, 04.04.2022) /// /// The string public static string CreateToken(User user) { var userClone = user.Clone(); userClone.Password = ""; var serializedUser = JsonSerializer.Serialize(userClone); var tokenHandler = new JwtSecurityTokenHandler(); var tokenDescriptor = new SecurityTokenDescriptor { Subject = new ClaimsIdentity(new[] { new Claim(ClaimTypes.UserData, serializedUser) }), Expires = DateTime.UtcNow.AddDays(30), Issuer = Issuer, Audience = Audience, SigningCredentials = new SigningCredentials(Cryptor.GetSigningKey(), SecurityAlgorithms.HmacSha256Signature) }; var token = tokenHandler.CreateToken(tokenDescriptor); return tokenHandler.WriteToken(token); } #endregion #region Public Method ValidateToken /// /// Validates the token using the specified token (a. beging, 04.04.2022) /// /// The token /// /// A task containing the bool public static bool ValidateToken(string? token, out User? user) { user = null; try { var tokenHandler = new JwtSecurityTokenHandler(); var result = tokenHandler.ValidateTokenAsync(token, new TokenValidationParameters { ValidateIssuerSigningKey = true, IssuerSigningKey = Cryptor.GetSigningKey(), ValidateAudience = true, ValidAudience = Audience, ValidateIssuer = true, ValidIssuer = Issuer }).Result; if (result.Claims.TryGetValue(ClaimTypes.UserData, out var jsonObj) && jsonObj != null) { user = JsonSerializer.Deserialize(jsonObj.ToString()!); if (user != null) user.Password = string.Empty; } return result.IsValid; } catch (Exception) { return false; } } #endregion /// /// The audience /// private const string Audience = "FS-Siegen"; /// /// The issuer /// private const string Issuer = "FS-Siegen"; } }