using System; using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using System.Text; using Microsoft.IdentityModel.Tokens; namespace DeluxeNET.Security { public class jwt { private readonly string _key = "CHANGE ME!"; public string GenerateToken(string userId) { var tokenHandler = new JwtSecurityTokenHandler(); var key = Encoding.UTF8.GetBytes(_key); var roles = new List { "gameClient", "moderator", "screenshare", "keepsake", "developer" }; var claims = new List { new Claim(ClaimTypes.NameIdentifier, userId) }; foreach (var role in roles) { claims.Add(new Claim(ClaimTypes.Role, role)); } var tokenDescriptor = new SecurityTokenDescriptor { Subject = new ClaimsIdentity(claims), Expires = DateTime.UtcNow.AddDays(7), SigningCredentials = new SigningCredentials( new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature ) }; var token = tokenHandler.CreateToken(tokenDescriptor); return tokenHandler.WriteToken(token); } public long? VerifyToken(string token) { if (string.IsNullOrEmpty(token)) return null; token = token.Trim(); if (token.StartsWith("Bearer ")) token = token.Substring("Bearer ".Length).Trim(); try { var tokenHandler = new JwtSecurityTokenHandler(); var key = Encoding.UTF8.GetBytes(_key); var validationParameters = new TokenValidationParameters { ValidateIssuer = false, ValidateAudience = false, ValidateLifetime = true, ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(key), ClockSkew = TimeSpan.Zero }; ClaimsPrincipal principal = tokenHandler.ValidateToken( token, validationParameters, out SecurityToken validatedToken ); var subClaim = principal.FindFirst(ClaimTypes.NameIdentifier)?.Value; if (long.TryParse(subClaim, out long playerId)) return playerId; return null; } catch (Exception ex) { Console.WriteLine(ex.Message); Console.WriteLine(ex.StackTrace); return null; } } } }