/
nicteres
/
Lab1
Обзор
Документация
Войти
/
nicteres
/
Lab1
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
123
API_Lab_1/src/Services/AuthService.cs
94 строки
3 KB
Matthew
Добавьте файлы проекта.
18 окт 2025, 18:03
18 окт 2025, 18:03
79e10ad
Код
Авторство
О чём код?
using API_Lab_1.src.Interface; using API_Lab_1.src.Models; using Microsoft.EntityFrameworkCore; using Microsoft.IdentityModel.Tokens; using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using System.Security.Cryptography; using System.Text; namespace API_Lab_1.src.Services { public class AuthService(AppDbContext _appDb) : IAuthService { public async Task<string?> LoginAsync(User_Request request) { if (request == null) return null; var user = await _appDb.Users.Where(u => u.UserName == request.UserName || u.Email == request.Email).FirstOrDefaultAsync(); if (user == null) return null; if (user.Password == request.Password) { return CreateToken(user); } return null; } public async Task<UserModel?> RegisterAsync(User_Request request) { if (request == null) return null; if (await _appDb.Users.AnyAsync(u => u.UserName == request.UserName.ToLower() || u.Email == request.Email)) return null; var user = new UserModel { UserName = request.UserName.ToLower(), Email = request.Email, Password = request.Password }; _appDb.Users.Add(user); await _appDb.SaveChangesAsync(); return user; } private async Task<string> RefreshTokenGeneration(UserModel user) { var refreshToken = GenerateRefreshToken(); user.RefreshToken = refreshToken; user.RefreshTokenExpiryTime = DateTime.UtcNow.AddDays(7); await _appDb.SaveChangesAsync(); return refreshToken; } private string CreateToken(UserModel user) { var claims = new List<Claim> { new Claim(ClaimTypes.Name, user.UserName), new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()), new Claim(ClaimTypes.Role, user.Role) }; var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(AuthOptions.KEY)); var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); var tokenDescriptor = new JwtSecurityToken( issuer: AuthOptions.ISSUER, audience: AuthOptions.AUDIENCE, claims: claims, expires: DateTime.UtcNow.AddMinutes(10), signingCredentials: creds ); return new JwtSecurityTokenHandler().WriteToken(tokenDescriptor); } private string GenerateRefreshToken() { var randomNumber = new byte[32]; using var rng = RandomNumberGenerator.Create(); rng.GetBytes(randomNumber); return Convert.ToBase64String(randomNumber); } } }