Реализован сервис сессии пользователя.
This commit is contained in:
parent
05642717c8
commit
da2329acea
3 changed files with 142 additions and 4 deletions
|
|
@ -123,6 +123,7 @@
|
||||||
<Compile Include="Models\SessionData.cs" />
|
<Compile Include="Models\SessionData.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
<Compile Include="Services\ISessionService.cs" />
|
<Compile Include="Services\ISessionService.cs" />
|
||||||
|
<Compile Include="Services\SessionService.cs" />
|
||||||
<EmbeddedResource Include="Properties\Intersvyaz.Core.rd.xml" />
|
<EmbeddedResource Include="Properties\Intersvyaz.Core.rd.xml" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|
@ -130,7 +131,12 @@
|
||||||
<Version>6.2.8</Version>
|
<Version>6.2.8</Version>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
</ItemGroup>
|
</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)' < '14.0' ">
|
<PropertyGroup Condition=" '$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' < '14.0' ">
|
||||||
<VisualStudioVersion>14.0</VisualStudioVersion>
|
<VisualStudioVersion>14.0</VisualStudioVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
|
||||||
|
|
@ -17,17 +17,20 @@ namespace Intersvyaz.Core.Services
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Получить сессию пользователя.
|
/// Получить сессию пользователя.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <param name="username">Имя пользователя.</param>
|
||||||
/// <returns>Данные об сессии.</returns>
|
/// <returns>Данные об сессии.</returns>
|
||||||
SessionData GetSession();
|
SessionData GetSession(string username);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Проверить, есть ли сессия пользователя.
|
/// Проверить, есть ли сессия пользователя.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
bool HasSession();
|
/// <param name="username">Имя пользователя.</param>
|
||||||
|
bool HasSession(string username);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Удалить сессию пользователя.
|
/// Удалить сессию пользователя.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
void DeleteSession();
|
/// <param name="username">Имя пользователя.</param>
|
||||||
|
void DeleteSession(string username);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
129
src/Intersvyaz.Core/Services/SessionService.cs
Normal file
129
src/Intersvyaz.Core/Services/SessionService.cs
Normal 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));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue