Lista użytkowników wraz z informacją czy użytkownik jest aktywny

0

Cześć :) ma listę użytkowników i chciałbym do niej dodać informację czy użytkownik jest zalogowany czy też nie.
Jaki jest najlepszy sposób, aby to wykonać ? Mam aplikacje backendową napisaną na .net core 3.1 oraz na frontendzie angular 10.

Mam taki pomysł aby dodać do bazy record IsActive oraz zmienic tą wartość przy logowaniu i wylogowaniu a listę pobierać z pomocą SignalR ale czy są jeszcze jakies inne sposoby ? :)

0

@AnyKtokolwiek: Przepraszam, masz rację :)
Tak wygląda klasa User:

    public class User : IdentityUser
    {

        public string FirstName { get; private set; }
        public string LastName { get; private set; }
        public string FullName { get; private set; }
        public DateTime CreatedAt { get; private set; }
        //public bool IsActive { get; private set; }

        public ICollection<Message> Messages { get; private set; }
        public ICollection<ConversationUser> ConversationUsers { get; private set; }

        public User(string email, string firstName, string lastName)
        {
            FirstName = firstName;
            LastName = lastName;
            Email = email;
            UserName = email;
            EmailConfirmed = false;
            SecurityStamp = Guid.NewGuid().ToString();
            CreatedAt = DateTime.UtcNow;
            FullName = FirstName + " " + LastName;
        }

        protected User()
        {

        }

        public void ChangeIsActive(bool isActive)
        {
            //IsActive = isActive;
        }
    }
1

zmienic tą wartość przy logowaniu i wylogowaniu

a jak wyłączy stronę bez wylogowywania?

już lepiej zrobić to w oparciu o SignalR, że przy połączeniu się zapisujesz do listy aktywnych, a przy rozłączeniu wyrzucasz.

Będzie to znacznie lepiej oddawać stan rzeczywisty.

0

@WeiXiao: hmmm ok, ale mam takie pytanie gdzie mam przechowywać tą listę aktywnych użytkowników ? Bo ogólnie coś podobnego robię z wiadomościami, w tym projekcie ,tylko mam coś takiego i lista jest w bazie a tutaj jak to najlepiej zrobić ?

            GetUsersId(message.ConversationId);

            var connectionIds = ChatHub
                .ConnectedUsers
                .Where(x => allowedClientNames.Contains(x.Value.ClientName))
                .Select(x => x.Value.ConnectionId)
                .ToList();


            await db.Messages.AddAsync(message);
            await hubContext.Clients.Clients(connectionIds).BroadcastMessage(message);
            await CommitAsync();
1

Czyli chcesz po prostu sprawdzić czy dany użytkownik jest zalogowany? Bo do końca nie wiem w jakim celu jest lista użytkowników.

Jednym ze sposobów są tokeny. Osobiście polecam tutoriale tego gościa: https://jasonwatmore.com/post/2020/07/09/angular-10-jwt-authentication-example-tutorial

Ma on tutki dla wszystkich wersji Angular, .Net Core, różnych scenariuszy. Choć nie wiem czy nie rzucasz się na zbyt głęboką wodę, jeśli nie masz opanowanych podstaw ASP.NET Core i Angulara.

1

@Michał Warmuz:

może to być nawet statyczna lista w Hubie czy jakiś inny wstrzykiwany bajer do Huba który nie będzie tracił tych danych (singleton?)

0

@WeiXiao:

        public static ConcurrentDictionary<string, ConnectedUserInfo> ConnectedUsers = new ConcurrentDictionary<string, ConnectedUserInfo>();

        public override Task OnConnectedAsync()
        {

            ConnectedUsers.TryAdd(Context.ConnectionId, new ConnectedUserInfo
            {
                ConnectionId = Context.ConnectionId,
                ClientName = Context.User.FindFirst(ClaimTypes.NameIdentifier).Value
            });

            var items = ConnectedUsers;
            return base.OnConnectedAsync();
        }

        public override Task OnDisconnectedAsync(Exception exception)
        {
            ConnectedUserInfo tmpMyUserInfo;

            ConnectedUsers.TryRemove(Context.ConnectionId, out tmpMyUserInfo);

            return base.OnDisconnectedAsync(exception);
        }

To fajnie działa :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1