public Task <IList <UserLoginInfo> > GetLoginsAsync(TUser user, CancellationToken cancellationToken)
        {
            var logins = ProviderNameValue.Parse(user.Logins)
                         .Select(l => new UserLoginInfo(l.Provider, l.Name, l.Value))
                         .ToList();

            return(Task.FromResult((IList <UserLoginInfo>)logins));
        }
        public Task <string> GetTokenAsync(TUser user, string loginProvider, string name, CancellationToken cancellationToken)
        {
            var tokens = ProviderNameValue.Parse(user.Tokens);

            var value = tokens.Where(t => t.Provider == loginProvider && t.Name == name).Select(t => t.Value).FirstOrDefault();

            return(Task.FromResult(value));
        }
        public Task RemoveLoginAsync(TUser user, string loginProvider, string providerKey, CancellationToken cancellationToken)
        {
            var existing = ProviderNameValue.Parse(user.Logins).ToList();

            if (0 < existing.RemoveAll(l => l.Provider == loginProvider && l.Name == providerKey))
            {
                user.Logins = ProviderNameValue.Generate(existing);
            }

            return(Task.FromResult(0));
        }
        public Task RemoveTokenAsync(TUser user, string loginProvider, string name, CancellationToken cancellationToken)
        {
            var tokens = ProviderNameValue.Parse(user.Tokens).ToList();

            if (0 < tokens.RemoveAll(t => t.Provider == loginProvider && t.Name == name))
            {
                user.Tokens = ProviderNameValue.Generate(tokens);
            }

            return(Task.FromResult(0));
        }
        public Task AddLoginAsync(TUser user, UserLoginInfo login, CancellationToken cancellationToken)
        {
            var existing = ProviderNameValue.Parse(user.Logins).ToList();

            existing.Add(new ProviderNameValue {
                Provider = login.LoginProvider, Name = login.ProviderKey, Value = login.ProviderDisplayName
            });

            user.Logins = ProviderNameValue.Generate(existing);

            return(Task.FromResult(0));
        }
        public Task SetTokenAsync(TUser user, string loginProvider, string name, string value, CancellationToken cancellationToken)
        {
            var tokens = ProviderNameValue.Parse(user.Tokens).ToList();

            tokens.RemoveAll(t => t.Provider == loginProvider && t.Name == name);

            tokens.Add(new ProviderNameValue {
                Provider = loginProvider, Name = name, Value = value
            });

            user.Tokens = ProviderNameValue.Generate(tokens);

            return(Task.FromResult(0));
        }