Ejemplo n.º 1
0
        /// <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();
        }
Ejemplo n.º 2
0
    /// <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);
    }
Ejemplo n.º 3
0
        /// <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());
        }
Ejemplo n.º 4
0
    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());
    }
Ejemplo n.º 5
0
    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;
            }
        }
    }
Ejemplo n.º 6
0
 /// <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);
 }
Ejemplo n.º 7
0
 public Task DeleteUserSessionsAsync(UserSessionsFilter filter)
 {
     DeleteUserSessionsWasCalled = true;
     DeleteUserSessionsFilter    = filter;
     return(Task.CompletedTask);
 }
Ejemplo n.º 8
0
    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);
    }
Ejemplo n.º 9
0
 public Task RevokeSessionsAsync(UserSessionsFilter filter, CancellationToken cancellationToken)
 {
     DeleteUserSessionsWasCalled = true;
     DeleteUserSessionsFilter    = filter;
     return(Task.CompletedTask);
 }