Реализован сервис сессии пользователя.

This commit is contained in:
mikhail "synzr" 2025-11-19 13:32:38 +05:00
parent 05642717c8
commit da2329acea
3 changed files with 142 additions and 4 deletions

View file

@ -123,6 +123,7 @@
<Compile Include="Models\SessionData.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Services\ISessionService.cs" />
<Compile Include="Services\SessionService.cs" />
<EmbeddedResource Include="Properties\Intersvyaz.Core.rd.xml" />
</ItemGroup>
<ItemGroup>
@ -130,7 +131,12 @@
<Version>6.2.8</Version>
</PackageReference>
</ItemGroup>
<ItemGroup />
<ItemGroup>
<ProjectReference Include="..\Intersvyaz.Net\Intersvyaz.Net.csproj">
<Project>{d53e9b31-82ca-4b3b-a6ba-9f4b9353abb1}</Project>
<Name>Intersvyaz.Net</Name>
</ProjectReference>
</ItemGroup>
<PropertyGroup Condition=" '$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' &lt; '14.0' ">
<VisualStudioVersion>14.0</VisualStudioVersion>
</PropertyGroup>

View file

@ -17,17 +17,20 @@ namespace Intersvyaz.Core.Services
/// <summary>
/// Получить сессию пользователя.
/// </summary>
/// <param name="username">Имя пользователя.</param>
/// <returns>Данные об сессии.</returns>
SessionData GetSession();
SessionData GetSession(string username);
/// <summary>
/// Проверить, есть ли сессия пользователя.
/// </summary>
bool HasSession();
/// <param name="username">Имя пользователя.</param>
bool HasSession(string username);
/// <summary>
/// Удалить сессию пользователя.
/// </summary>
void DeleteSession();
/// <param name="username">Имя пользователя.</param>
void DeleteSession(string username);
}
}

View file

@ -0,0 +1,129 @@
using System;
using System.Linq;
using System.Threading.Tasks;
using System.Globalization;
using Intersvyaz.Net;
using Intersvyaz.Core.Models;
using Windows.Security.Credentials;
namespace Intersvyaz.Core.Services
{
public class SessionService : ISessionService
{
/// <summary>
/// Имя ресурса.
/// </summary>
private const string RESOURCE_NAME = "Intersvyaz";
/// <summary>
/// Клиент Интерсвязи.
/// </summary>
private IntersvyazClient _intersvyazClient;
/// <summary>
/// Хранилище паролей.
/// </summary>
private PasswordVault _passwordVault;
public SessionService(IntersvyazClient intersvyazClient)
{
_intersvyazClient = intersvyazClient;
_passwordVault = new PasswordVault();
}
/// <inheritdoc />
public async Task<SessionData> GetSessionAsync(string username, string password)
{
try
{
return GetSession(username);
}
catch
{
return await LoginAndSaveSession(username, password);
}
}
/// <inheritdoc />
public SessionData GetSession(string username)
{
var passwordCredential = _passwordVault.Retrieve(RESOURCE_NAME, username);
return ConvertToSessionData(passwordCredential);
}
/// <inheritdoc />
public bool HasSession(string username)
{
var passwordCredentials = _passwordVault.FindAllByResource(RESOURCE_NAME);
var count = passwordCredentials
.Where(passwordCredential => passwordCredential.UserName == username)
.Count();
return count > 0;
}
/// <inheritdoc />
public void DeleteSession(string username)
{
var passwordCredential = _passwordVault.Retrieve(RESOURCE_NAME, username);
_passwordVault.Remove(passwordCredential);
}
/// <summary>
/// Войти в систему и сохранить сессию пользователя.
/// </summary>
/// <param name="username">Имя пользователя.</param>
/// <param name="password">Пароль пользователя.</param>
/// <returns>Данные об сессии.</returns>
private async Task<SessionData> LoginAndSaveSession(string username, string password)
{
var responseDto = await _intersvyazClient.Login(username, password);
var sessionData = new SessionData()
{
Token = responseDto.Token,
ExpiresAt = responseDto.AccessEnd,
Username = username,
};
var passwordCredential = ConvertToPasswordCredential(sessionData);
_passwordVault.Add(passwordCredential);
return sessionData;
}
/// <summary>
/// Сконвертировать нативную учетчую запсть в SessionData.
/// </summary>
/// <param name="passwordCredential">Учетная запись.</param>
/// <returns>Данные об сессии.</returns>
private SessionData ConvertToSessionData(PasswordCredential passwordCredential)
{
var entries = passwordCredential.Password.Split(
new string[] { ";" }, 2, StringSplitOptions.RemoveEmptyEntries);
return new SessionData()
{
Token = entries[0],
ExpiresAt = DateTime.Parse(entries[1], CultureInfo.InvariantCulture),
Username = passwordCredential.UserName,
};
}
/// <summary>
/// Сконвертировать SessionData в нативную учетную запись.
/// </summary>
/// <param name="sessionData">Данные об сессии.</param>
/// <returns>Нативная учетная запись.</returns>
private PasswordCredential ConvertToPasswordCredential(SessionData sessionData)
{
var entries = new string[]
{
sessionData.Token,
sessionData.ExpiresAt.ToString(CultureInfo.InvariantCulture),
};
return new PasswordCredential(
RESOURCE_NAME, sessionData.Username, string.Join(";", entries));
}
}
}