/// <inheritdoc/> public async Task DeleteUserSessionsAsync(UserSessionsFilter filter) { filter.Validate(); var query = _sessionDbContext.UserSessions.AsQueryable(); if (!String.IsNullOrWhiteSpace(filter.SubjectId)) { query = query.Where(x => x.SubjectId == filter.SubjectId); } if (!String.IsNullOrWhiteSpace(filter.SessionId)) { query = query.Where(x => x.SessionId == filter.SessionId); } var items = await query.ToArrayAsync(); if (!String.IsNullOrWhiteSpace(filter.SubjectId)) { items = items.Where(x => x.SubjectId == filter.SubjectId).ToArray(); } if (!String.IsNullOrWhiteSpace(filter.SessionId)) { items = items.Where(x => x.SessionId == filter.SessionId).ToArray(); } _sessionDbContext.RemoveRange(items); await _sessionDbContext.SaveChangesAsync(); }
/// <inheritdoc/> public async Task RevokeSessionsAsync(UserSessionsFilter filter, CancellationToken cancellationToken = default) { if (_options.BackchannelLogoutAllUserSessions) { filter.SessionId = null; } if (_options.RevokeRefreshTokenOnLogout) { var tickets = await _ticketStore.GetUserTicketsAsync(filter); if (tickets?.Any() == true) { foreach (var ticket in tickets) { var refreshToken = ticket.Properties.GetTokenValue("refresh_token"); if (!String.IsNullOrWhiteSpace(refreshToken)) { var response = await _tokenEndpoint.RevokeRefreshTokenAsync(refreshToken); if (response.IsError) { _logger.LogDebug("Error revoking refresh token: {error} for subject id: {sub} and session id: {sid}", response.Error, ticket.GetSubjectId(), ticket.GetSessionId()); } else { _logger.LogDebug("Refresh token revoked successfully for subject id: {sub} and session id: {sid}", ticket.GetSubjectId(), ticket.GetSessionId()); } } } } } await _sessionStore.DeleteUserSessionsAsync(filter); }
/// <inheritdoc/> public async Task <IEnumerable <UserSession> > GetUserSessionsAsync(UserSessionsFilter filter) { filter.Validate(); var query = _sessionDbContext.UserSessions.AsQueryable(); if (!String.IsNullOrWhiteSpace(filter.SubjectId)) { query = query.Where(x => x.SubjectId == filter.SubjectId); } if (!String.IsNullOrWhiteSpace(filter.SessionId)) { query = query.Where(x => x.SessionId == filter.SessionId); } var items = await query.ToArrayAsync(); if (!String.IsNullOrWhiteSpace(filter.SubjectId)) { items = items.Where(x => x.SubjectId == filter.SubjectId).ToArray(); } if (!String.IsNullOrWhiteSpace(filter.SessionId)) { items = items.Where(x => x.SessionId == filter.SessionId).ToArray(); } return(items.Select(x => { var item = new UserSession(); x.CopyTo(item); return item; }).ToArray()); }
public async Task <IReadOnlyCollection <UserSession> > GetUserSessionsAsync(UserSessionsFilter filter, CancellationToken cancellationToken) { filter.Validate(); var query = _sessionDbContext.UserSessions.Where(x => x.ApplicationName == _applicationDiscriminator).AsQueryable(); if (!String.IsNullOrWhiteSpace(filter.SubjectId)) { query = query.Where(x => x.SubjectId == filter.SubjectId); } if (!String.IsNullOrWhiteSpace(filter.SessionId)) { query = query.Where(x => x.SessionId == filter.SessionId); } var items = await query.Where(x => x.ApplicationName == _applicationDiscriminator).ToArrayAsync(cancellationToken); if (!String.IsNullOrWhiteSpace(filter.SubjectId)) { items = items.Where(x => x.SubjectId == filter.SubjectId).ToArray(); } if (!String.IsNullOrWhiteSpace(filter.SessionId)) { items = items.Where(x => x.SessionId == filter.SessionId).ToArray(); } return(items.Select(x => { var item = new UserSession(); x.CopyTo(item); return item; }).ToArray()); }
public async Task DeleteUserSessionsAsync(UserSessionsFilter filter, CancellationToken cancellationToken) { filter.Validate(); var query = _sessionDbContext.UserSessions.Where(x => x.ApplicationName == _applicationDiscriminator).AsQueryable(); if (!String.IsNullOrWhiteSpace(filter.SubjectId)) { query = query.Where(x => x.SubjectId == filter.SubjectId); } if (!String.IsNullOrWhiteSpace(filter.SessionId)) { query = query.Where(x => x.SessionId == filter.SessionId); } var items = await query.Where(x => x.ApplicationName == _applicationDiscriminator).ToArrayAsync(cancellationToken); if (!String.IsNullOrWhiteSpace(filter.SubjectId)) { items = items.Where(x => x.SubjectId == filter.SubjectId).ToArray(); } if (!String.IsNullOrWhiteSpace(filter.SessionId)) { items = items.Where(x => x.SessionId == filter.SessionId).ToArray(); } _sessionDbContext.RemoveRange(items); try { await _sessionDbContext.SaveChangesAsync(cancellationToken); } catch (DbUpdateConcurrencyException ex) { // suppressing exception for concurrent deletes // https://github.com/DuendeSoftware/BFF/issues/63 _logger.LogDebug("DbUpdateConcurrencyException: {error}", ex.Message); foreach (var entry in ex.Entries) { // mark detatched so another call to SaveChangesAsync won't throw again entry.State = EntityState.Detached; } } }
/// <inheritdoc /> public Task RevokeSessionsAsync(UserSessionsFilter filter, CancellationToken cancellationToken = default) { _logger.LogDebug("Nop implementation of session revocation for sub: {sub}, and sid: {sid}. Implement ISessionRevocationService to provide your own implementation.", filter.SubjectId, filter.SessionId); return(Task.CompletedTask); }
public Task DeleteUserSessionsAsync(UserSessionsFilter filter) { DeleteUserSessionsWasCalled = true; DeleteUserSessionsFilter = filter; return(Task.CompletedTask); }
public async Task <IReadOnlyCollection <AuthenticationTicket> > GetUserTicketsAsync(UserSessionsFilter filter, CancellationToken cancellationToken) { var list = new List <AuthenticationTicket>(); var sessions = await _store.GetUserSessionsAsync(filter, cancellationToken); foreach (var session in sessions) { var ticket = session.Deserialize(_protector, _logger); if (ticket != null) { list.Add(ticket); } else { // if we failed to get a ticket, then remove DB record _logger.LogWarning("Failed to deserialize authentication ticket from store, deleting record for key {key}", session.Key); await RemoveAsync(session.Key); } } return(list); }
public Task RevokeSessionsAsync(UserSessionsFilter filter, CancellationToken cancellationToken) { DeleteUserSessionsWasCalled = true; DeleteUserSessionsFilter = filter; return(Task.CompletedTask); }