122 lines
4.5 KiB
C#
122 lines
4.5 KiB
C#
|
|
using OfficeFlow.Models;
|
|||
|
|
using System;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using System.Linq;
|
|||
|
|
using System.Text;
|
|||
|
|
using System.Threading.Tasks;
|
|||
|
|
|
|||
|
|
namespace OfficeFlow.Utils
|
|||
|
|
{
|
|||
|
|
public static class Session
|
|||
|
|
{
|
|||
|
|
// Текущий авторизованный пользователь
|
|||
|
|
public static User CurrentUser { get; private set; }
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// Авторизация пользователя по логину и паролю
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="login">Логин пользователя</param>
|
|||
|
|
/// <param name="password">Пароль пользователя</param>
|
|||
|
|
/// <returns>True, если авторизация успешна</returns>
|
|||
|
|
public static bool Authenticate(string login, string password)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
// Находим пользователя по логину
|
|||
|
|
var user = App.Entities.Users.FirstOrDefault(u => u.Login == login);
|
|||
|
|
if (user == null)
|
|||
|
|
{
|
|||
|
|
throw new Exception("Пользователь с таким логином не найден.");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Проверяем пароль
|
|||
|
|
if (!String.Equals(HashPassword(password), user.PasswordHash))//!BCrypt.Verify(password, user.PasswordHash))
|
|||
|
|
{
|
|||
|
|
throw new Exception("Неверный пароль.");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Устанавливаем текущего пользователя
|
|||
|
|
CurrentUser = user;
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
throw new Exception($"Ошибка авторизации: {ex.Message}");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// Создание нового пользователя
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="login">Логин</param>
|
|||
|
|
/// <param name="password">Пароль</param>
|
|||
|
|
/// <param name="email">Email</param>
|
|||
|
|
/// <returns>Созданный пользователь</returns>
|
|||
|
|
public static User CreateUser(string login, string password, Role role, string email=null)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
// Проверяем уникальность логина и email
|
|||
|
|
if (App.Entities.Users.Any(u => u.Login == login))
|
|||
|
|
{
|
|||
|
|
throw new Exception("Пользователь с таким логином уже существует.");
|
|||
|
|
}
|
|||
|
|
if (App.Entities.Users.Any(u => u.Email == email))
|
|||
|
|
{
|
|||
|
|
throw new Exception("Пользователь с таким email уже существует.");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Создаем нового пользователя
|
|||
|
|
var newUser = new User
|
|||
|
|
{
|
|||
|
|
Login = login,
|
|||
|
|
PasswordHash = HashPassword(password), // Хэшируем пароль
|
|||
|
|
Email = email,
|
|||
|
|
AccountStatusID = App.Entities.AccountStatuses.Where((acs) => acs.StatusName == "Активен").First().StatusID
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
App.Entities.Users.Add(newUser);
|
|||
|
|
App.Entities.User_Role.Add(
|
|||
|
|
new User_Role
|
|||
|
|
{
|
|||
|
|
Role = role,
|
|||
|
|
User = newUser
|
|||
|
|
}
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
|
|||
|
|
// Возвращаем созданного пользователя
|
|||
|
|
return newUser;
|
|||
|
|
}
|
|||
|
|
catch (Exception ex)
|
|||
|
|
{
|
|||
|
|
throw new Exception($"Ошибка при создании пользователя: {ex.Message}");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// Хэширование пароля
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="password">Пароль</param>
|
|||
|
|
/// <returns>Хэшированный пароль</returns>
|
|||
|
|
private static string HashPassword(string password)
|
|||
|
|
{
|
|||
|
|
return password.GetHashCode().ToString();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// Выход из системы (очистка текущего пользователя)
|
|||
|
|
/// </summary>
|
|||
|
|
public static void Logout()
|
|||
|
|
{
|
|||
|
|
CurrentUser = null;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static bool Authenticate(User user)
|
|||
|
|
{
|
|||
|
|
CurrentUser = user;
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|