Реализован сервис сессии пользователя.
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="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)' < '14.0' ">
|
||||
<VisualStudioVersion>14.0</VisualStudioVersion>
|
||||
</PropertyGroup>
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
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