/
fr1n1ss
/
PasswordManager
Обзор
Документация
Войти
/
fr1n1ss
/
PasswordManager
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
PasswordManagerAPI/Services/SecurityHelper.cs
117 строк
4 KB
Dmitry Kiselyov
Уборка в коде
11 май 2026, 21:01
11 май 2026, 21:01
04fa056
Код
Авторство
О чём код?
using System; using System.Security.Cryptography; using System.Text; using Microsoft.IdentityModel.Tokens; using System.IdentityModel.Tokens.Jwt; using Microsoft.Extensions.Configuration; using global::PasswordManagerAPI.Entities; using System.Security.Claims; namespace PasswordManagerAPI.Services { public class SecurityHelper { private readonly IConfiguration _config; public SecurityHelper(IConfiguration config) { _config = config ?? throw new ArgumentNullException(nameof(config)); } public string GenerateJwtToken(User user, Guid sessionId, string jwtId) { var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Jwt:Key"])); var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); var claims = new[] { new Claim(JwtRegisteredClaimNames.Sub, user.Username), new Claim(JwtRegisteredClaimNames.Jti, jwtId), new Claim("userId", user.Id.ToString()), new Claim("sid", sessionId.ToString()) }; var token = new JwtSecurityToken( _config["Jwt:Issuer"], _config["Jwt:Audience"], claims, expires: DateTime.UtcNow.AddHours(1), signingCredentials: creds); return new JwtSecurityTokenHandler().WriteToken(token); } public string HashPassword(string password, string salt) { using (var sha256 = SHA256.Create()) { string saltedPassword = password + salt; byte[] bytes = Encoding.UTF8.GetBytes(saltedPassword); byte[] hashBytes = sha256.ComputeHash(bytes); return Convert.ToHexString(hashBytes); } } public bool VerifyPassword(string password, string hashedPassword, string salt) { using (var sha256 = SHA256.Create()) { string saltedPassword = password + salt; byte[] bytes = Encoding.UTF8.GetBytes(saltedPassword); byte[] hashBytes = sha256.ComputeHash(bytes); string computedHash = Convert.ToHexString(hashBytes); return computedHash == hashedPassword; } } public string GenerateTempToken(User user) { var claims = new[] { new Claim("userId", user.Id.ToString()), new Claim("type", "temp") }; var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Jwt:Key"])); var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); var token = new JwtSecurityToken( issuer: _config["Jwt:Issuer"], audience: _config["Jwt:Audience"], claims: claims, expires: DateTime.UtcNow.AddMinutes(5), signingCredentials: creds ); return new JwtSecurityTokenHandler().WriteToken(token); } public ClaimsPrincipal ValidateToken(string token, bool requireTempToken = false) { var tokenHandler = new JwtSecurityTokenHandler(); var parameters = new TokenValidationParameters { ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Jwt:Key"])), ValidateIssuer = true, ValidateAudience = true, ValidIssuer = _config["Jwt:Issuer"], ValidAudience = _config["Jwt:Audience"], ClockSkew = TimeSpan.Zero }; var principal = tokenHandler.ValidateToken(token, parameters, out _); if (requireTempToken && principal.FindFirst("type")?.Value != "temp") { throw new SecurityTokenException("Invalid token type"); } return principal; } } }