public ExternalLoginInfo AddUserInfo(Person person, ShibbolethAuthenticationProvider provider, String externalString)
        {
            Person currentUser = Manager.GetPerson(UC.CurrentUserID);

            return(AddUserInfo(person, (currentUser == null) ? person : currentUser, provider, externalString));
        }
        private ExternalLoginInfo AddUserInfo(Person person, Person currentUser, ShibbolethAuthenticationProvider provider, String externalString)
        {
            ExternalLoginInfo account = null;

            try
            {
                Manager.BeginTransaction();

                // find accounts for user
                List <ExternalLoginInfo> accounts = (from si in Manager.GetIQ <ExternalLoginInfo>() where si.Person == person && si.Provider == provider select si).ToList();
                // verify if externalString must be splitted
                List <String> multipleIdentifiers = null;
                if (provider.MultipleItemsForRecord && !string.IsNullOrEmpty(provider.MultipleItemsSeparator))
                {
                    multipleIdentifiers = externalString.Split(provider.MultipleItemsSeparator.ToArray(), StringSplitOptions.RemoveEmptyEntries).ToList();
                }

                if (multipleIdentifiers == null || multipleIdentifiers.Count == 0)
                {
                    account = accounts.Where(a => a.IdExternalString.ToLower() == externalString.ToLower()).FirstOrDefault();
                    if (account == null)
                    {
                        account = CreateAccount(person, currentUser, provider, externalString);
                    }
                    else
                    {
                        UpdateAccount(account, person, currentUser, provider, externalString);
                    }
                    Manager.SaveOrUpdate(account);
                    AddToHistory(account);
                }
                else
                {
                    foreach (ExternalLoginInfo item in accounts)
                    {
                        List <String> itemIdentifiers = item.IdExternalString.Split(provider.MultipleItemsSeparator.ToArray(), StringSplitOptions.RemoveEmptyEntries).ToList();
                        if (itemIdentifiers.Where(i => multipleIdentifiers.Contains(i)).Any())
                        {
                            account = item;
                            multipleIdentifiers.Where(mi => !itemIdentifiers.Contains(mi)).ToList().ForEach(i => account.IdExternalString += provider.MultipleItemsSeparator + i);
                            break;
                        }
                    }
                    if (account == null)
                    {
                        account = CreateAccount(person, currentUser, provider, externalString);
                    }
                    else
                    {
                        UpdateAccount(account, person, currentUser, provider, account.IdExternalString);
                    }
                    AddToHistory(account);
                    Manager.SaveOrUpdate(account);
                }
                if (person.IdDefaultProvider == 0 || String.IsNullOrEmpty(person.FirstLetter))
                {
                    //// TEMPORANEO
                    //creator.Login = login;
                    //creator.Password=userInfo.Password;
                    //// TEMPORANEO
                    if (person.IdDefaultProvider == 0 && provider != null)
                    {
                        person.IdDefaultProvider = provider.Id;
                    }
                    if (String.IsNullOrEmpty(person.FirstLetter))
                    {
                        person.FirstLetter = person.Surname[0].ToString().ToLower();
                    }
                    Manager.SaveOrUpdate(person);
                }
                Manager.Commit();
            }
            catch (Exception ex)
            {
            }
            return(account);
        }
 public ExternalLoginInfo AddFromInternalAccount(InternalLoginInfo internalAccount, ShibbolethAuthenticationProvider provider, String externalString)
 {
     return(AddUserInfo(internalAccount.Person, internalAccount.Person, provider, externalString));
 }