87 lines
2.9 KiB
C#
87 lines
2.9 KiB
C#
using System;
|
|
using System.Linq;
|
|
using System.Threading.Tasks;
|
|
using gehGassi.Core.Interfaces;
|
|
using gehGassi.Domain.Users;
|
|
|
|
namespace gehGassi.Core.Services
|
|
{
|
|
/// <summary>
|
|
/// Service der die Verwaltung von gespeicherten Authentifizierungs-Ticktes ermöglicht
|
|
/// </summary>
|
|
public class PersistedTicketService : ServiceBase<PersistedTicket>, IPersistedTicketService
|
|
{
|
|
/// <summary>
|
|
/// Erstellt eine Instanz
|
|
/// </summary>
|
|
/// <param name="unitOfWork">Instanz eines IUnitOfWork</param>
|
|
/// <param name="configuration">Instanz eines IConfiguration</param>
|
|
public PersistedTicketService(IUnitOfWork unitOfWork) : base(unitOfWork)
|
|
{
|
|
|
|
}
|
|
|
|
/// <summary>
|
|
/// Löscht alle abgelaufenen Tickets
|
|
/// </summary>
|
|
/// <returns>true wenn erfolgreich, false sonst</returns>
|
|
public async Task<bool> RemoveExpiredAsync()
|
|
{
|
|
var items = await Repository.FindAsync(c => c.Expires < DateTimeOffset.UtcNow).ConfigureAwait(false);
|
|
if (items.Any())
|
|
{
|
|
Repository.RemoveRange(items);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Speichern eines Tickets.
|
|
/// Wenn es noch nicht existiert, wird es angelegt.
|
|
/// Wenn es existiert, wird es aktualisiert
|
|
/// </summary>
|
|
/// <param name="key">Key des Tickes</param>
|
|
/// <param name="userId">Benutzername</param>
|
|
/// <param name="ticket">Ticket als Byte-Array</param>
|
|
/// <param name="expires">Ablaufdatum des Tickets</param>
|
|
/// <returns>Task</returns>
|
|
public async Task SaveAsync(string key, string userId, byte[] ticket, DateTimeOffset? expires)
|
|
{
|
|
var item = await Repository.FirstOrDefaultAsync(c => c.Key == key).ConfigureAwait(false);
|
|
if (item != null)
|
|
{
|
|
item.Ticket = ticket;
|
|
item.Expires = expires;
|
|
}
|
|
else
|
|
{
|
|
var persistedTicket = new PersistedTicket()
|
|
{
|
|
Key = key,
|
|
UserId = userId,
|
|
Expires = expires,
|
|
Ticket = ticket
|
|
};
|
|
Repository.Add(persistedTicket);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Löschen eines Tickets aus dem Store
|
|
/// </summary>
|
|
/// <param name="key">Key des Tickets</param>
|
|
/// <returns>true wenn erfolgreich, false sonst</returns>
|
|
public async Task<bool> RemoveAsync(string key)
|
|
{
|
|
var item = await Repository.FirstOrDefaultAsync(c => c.Key == key).ConfigureAwait(false);
|
|
if (item != null)
|
|
{
|
|
Repository.Remove(item);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
}
|
|
}
|