예제 #1
0
        private UserAccount DoCreate(AzureUser newUser)
        {
            var systemUserId = UserAccount.SYSTEM_USER_ACCOUNT_ID;
            var now          = DateTimeOffset.UtcNow;
            var userAccount  = new UserAccount
            {
                AccountStatusId = AccountStatus.Active.Id,
                AdGuid          = newUser.Id,
                CreatedBy       = systemUserId,
                CreatedOn       = now,
                DisplayName     = newUser.DisplayName,
                EmailAddress    = newUser.Email,
                FirstName       = newUser.FirstName,
                LastAccessed    = now,
                LastName        = newUser.LastName,
                RevisedBy       = systemUserId,
                RevisedOn       = now
            };
            var principal = new Principal
            {
                PrincipalTypeId = PrincipalType.Person.Id,
            };

            userAccount.Principal = principal;
            principal.UserAccount = userAccount;
            Context.UserAccounts.Add(userAccount);
            Context.Principals.Add(principal);
            return(userAccount);
        }
예제 #2
0
        public async Task PatchUser(string id, AzureUser user)
        {
            var userToUpdate = user.Adapt <AzureUserToPatch>();
            var content      = new StringContent(JsonConvert.SerializeObject(userToUpdate), Encoding.UTF8, "application/json");
            var response     = await SendRequest(HttpMethod.Patch, Consts.GraphApi.UserEntity, content, id);

            if (!response.IsSuccessStatusCode)
            {
                throw new ApplicationException("Can not update user with current parameters");
            }
        }
예제 #3
0
 private static bool AllTrue(UserFilters condition, AzureUser user)
 {
     foreach (UserFilters t in condition.GetInvocationList())
     {
         if (!t(user))
         {
             return(false);
         }
     }
     return(true);
 }
예제 #4
0
        public void TestCreate()
        {
            var firstName   = "first";
            var lastName    = "lastName";
            var email       = "email";
            var id          = Guid.NewGuid();
            var displayName = "display";
            var newUser     = new AzureUser(
                id: id,
                email: email,
                firstName: firstName,
                lastName: lastName,
                displayName: displayName
                );

            Assert.AreEqual(0, context.UserAccounts.Count());
            Assert.AreEqual(0, context.Principals.Count());

            var userAccount = service.Create(newUser);

            Assert.AreEqual(1, context.UserAccounts.Count());
            Assert.AreEqual(1, context.Principals.Count());

            var savedUserAccount = context.UserAccounts.First();
            var savedPrincipal   = context.Principals.First();

            Assert.AreEqual(savedUserAccount, savedPrincipal.UserAccount);
            Assert.AreEqual(savedPrincipal, savedUserAccount.Principal);
            Assert.IsTrue(Object.ReferenceEquals(userAccount, savedUserAccount));
            Assert.AreEqual(PrincipalType.Person.Id, savedPrincipal.PrincipalTypeId);

            Assert.AreEqual(firstName, savedUserAccount.FirstName);
            Assert.AreEqual(lastName, savedUserAccount.LastName);
            Assert.AreEqual(email, savedUserAccount.EmailAddress);
            Assert.AreEqual(id, savedUserAccount.AdGuid);
            Assert.AreEqual(displayName, savedUserAccount.DisplayName);
            Assert.AreEqual(AccountStatus.Active.Id, savedUserAccount.AccountStatusId);
            Assert.AreEqual(UserAccount.SYSTEM_USER_ACCOUNT_ID, savedUserAccount.CreatedBy);
            Assert.AreEqual(UserAccount.SYSTEM_USER_ACCOUNT_ID, savedUserAccount.RevisedBy);

            Assert.IsTrue(savedUserAccount.LastAccessed.HasValue);
            DateTimeOffset.Now.Should().BeCloseTo(savedUserAccount.CreatedOn, 2000);
            DateTimeOffset.Now.Should().BeCloseTo(savedUserAccount.RevisedOn, 2000);
            DateTimeOffset.Now.Should().BeCloseTo(savedUserAccount.LastAccessed.Value, 2000);
            Assert.IsNull(savedUserAccount.Note);

            Assert.IsFalse(savedUserAccount.ExpiredDate.HasValue);
            Assert.IsFalse(savedUserAccount.PermissionsRevisedOn.HasValue);
            Assert.IsFalse(savedUserAccount.RestoredDate.HasValue);
            Assert.IsFalse(savedUserAccount.RevokedDate.HasValue);
            Assert.IsFalse(savedUserAccount.SuspendedDate.HasValue);
        }
예제 #5
0
        public async Task InsertUserIntoTable(AzureUser user)
        {
            var table = await _tableStorage.GetTableReference(_userTable);

            var userEntity = new UserEntity()
            {
                PartitionKey = user.PartitionKey,
                RowKey       = user.Id
            };

            var tableOperation = TableOperation.InsertOrMerge(userEntity);
            await table.ExecuteAsync(tableOperation);
        }
예제 #6
0
        private static bool FilterUserByStatus(AzureUser user, string status)
        {
            switch (status)
            {
            case Consts.UserStatuses.Active:
                return(user.RequestStatus?.Name?.ToLower() == Consts.UserStatuses.CPActiveUserStatus && user.AccountEnabled == true);

            case Consts.UserStatuses.Disabled:
                return(user.RequestStatus?.Name?.ToLower() != Consts.UserStatuses.CPActiveUserStatus || user.AccountEnabled == false);

            default:
                throw new ArgumentException("Unknown status", nameof(status));
            }
        }
예제 #7
0
        public void UpdateUserInCache(AzureUser model)
        {
            var usersInCache = _cache.Get <List <AzureUser> >(Consts.Cache.UsersKey);
            var user         = usersInCache.FirstOrDefault(x => x.ObjectId == model.ObjectId);

            if (user != null)
            {
                MergeObjects(model, user);
            }
            else
            {
                usersInCache.Add(model.Adapt <AzureUser>());
            }
            _cache.Set(Consts.Cache.UsersKey, usersInCache);
        }
예제 #8
0
        static void Main(string[] args)
        {
            try
            {
                //Extendemos la propiedad en Azure para que esté disponible
                //AzureUserCollection.ExtendAzureADProperties();

                //Listamos todas las propiedades extendidas del AD
                var allProperties = AzureUserCollection.GetExtendedPropertiesFromAD();
                foreach (var property in allProperties)
                {
                    Console.WriteLine(property);
                }

                //Asignamos la propiedad a un usuario
                var userTest = new AzureUser()
                {
                    AccountUPN     = "*****@*****.**",
                    TiendaAsociada = "Barcelona Paseo de gracia"
                };
                userTest.SetUserCustomPropertiesInAD();

                //Obtenemos y pintamos las propiedades del usuario
                userTest.GetUserPropertiesFromAD();
                Console.WriteLine(userTest.TiendaAsociada);


                Console.ReadKey();
            }
            catch (Exception ex)
            {
                Console.WriteLine("An error has occurred");
                Console.WriteLine(ex.Message);
                while (ex.InnerException != null)
                {
                    ex = ex.InnerException;
                    Console.WriteLine(ex.Message);
                }
                Console.ReadKey();
            }
        }
예제 #9
0
        public async Task <AzureUser> PostUser(AzureUser user)
        {
            var content  = new StringContent(JsonConvert.SerializeObject(user), Encoding.UTF8, "application/json");
            var response = await SendRequest(HttpMethod.Post, Consts.GraphApi.UserEntity, content);

            if (!response.IsSuccessStatusCode)
            {
                var responseMessage = await response?.Content?.ReadAsAsync <ErrorResponse>();

                if (responseMessage.Odata.Message.Value == GraphApi.Errors.UserAlreadyExist)
                {
                    throw new ApplicationException("User already exist");
                }
                throw new ApplicationException($"Can not create user with current parameters\n {responseMessage.Odata.Message.Value}");
            }
            var createdUser = await response?.Content?.ReadAsStringAsync();

            var value = JsonConvert.DeserializeObject(createdUser) as JToken;

            return(value.ToObject <AzureUser>());
        }
예제 #10
0
        public void TestConstructor()
        {
            var firstName   = "first";
            var lastName    = "lastName";
            var email       = "email";
            var id          = Guid.NewGuid();
            var displayName = "display";
            var newUser     = new AzureUser(
                id: id,
                email: email,
                firstName: firstName,
                lastName: lastName,
                displayName: displayName
                );

            Assert.AreEqual(firstName, newUser.FirstName);
            Assert.AreEqual(lastName, newUser.LastName);
            Assert.AreEqual(email, newUser.Email);
            Assert.AreEqual(id, newUser.Id);
            Assert.AreEqual(displayName, newUser.DisplayName);
        }
예제 #11
0
        public async Task <AzureUser> GetUserDetailsByEmail(string email, bool includeSubscriptions = false, bool includeGroups = false)
        {
            AzureUser user = null;

            if (!string.IsNullOrWhiteSpace(email))
            {
                using (var httpRequest = new HttpRequestMessage(HttpMethod.Get, $"/users?api-version=2017-03-01&expandGroups={includeGroups}&$top=1&$filter=email eq '{email}'"))
                {
                    var response = await RequestAndDeserialiseAsync <AzureUserResponse>(httpRequest, "Could not get User");

                    user = response.Users.FirstOrDefault();
                }

                if (user != null && user.AzureId != null && includeSubscriptions)
                {
                    var subscriptions = await GetSubscriptionsForUser(user.Id);

                    user.Subscriptions.AddRange(subscriptions);
                }
            }

            return(user);
        }
예제 #12
0
        private void CreateTestUserAccount()
        {
            AzureUser testAzureUser = new AzureUser
            {
                SessionTimeout          = 60,
                IsLockedOut             = false,
                IsOnline                = false,
                LastActivityDate        = DateTime.Now,
                LastLockoutDate         = new DateTime(1900, 1, 1),
                LastPasswordChangedDate = new DateTime(1900, 1, 1),
                LastLoginDate           = new DateTime(1900, 1, 1),
                RealName                = "Jack Daniels",
                Email        = "*****@*****.**",
                CreationDate = DateTime.Now,
                IsApproved   = true,
                Password     = "******",
                Username     = "******",
                PartitionKey = "j",
                RowKey       = Guid.NewGuid().ToString()
            };

            //save test user
            new AzureUserRepository().Save(testAzureUser);

            string    roleID        = Guid.NewGuid().ToString();
            AzureRole azureUserRole = new AzureRole
            {
                RowKey       = roleID,
                RoleName     = "Webmaster",
                PartitionKey = roleID.Substring(0, 1),
                UserRowKey   = testAzureUser.RowKey,
                Timestamp    = DateTime.Now
            };

            //save a role for the test user
            new AzureRoleRepository().Save(azureUserRole);
        }
예제 #13
0
 private string GetUserEmail(AzureUser user) => user.SignInNames.FirstOrDefault(name => name.Type == "emailAddress")?.Value;
예제 #14
0
 public static ApplicationUser NewUser(string username, string email)
 {
     return(AzureUser.NewUser <ApplicationUser>(username, email));
 }
예제 #15
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="newUser"></param>
 /// <returns></returns>
 public UserAccount Create(AzureUser newUser)
 {
     Contract.Requires(newUser != null, "The user must not be null.");
     return(null);
 }
예제 #16
0
        public void GroupSync(Logger Logger, IConfiguration config, IAuthenticationProvidor authProvidor, IAzureADFunctions azureAdFunctions, IOnPremADHelper onPremAdHelper, IOnPremAdFunctions onPremAdFunctions, ActiveDirectoryClient AzureClientSession)
        {
            //Get Entry into On-prem Active Directory Groups OU.
            DirectoryEntry _OnPremGroupsDirectoryEntry = onPremAdHelper.GetADDirectoryEntry(config.FQDomainName, config.GroupsDestinationOUDN, Logger);

            //Gather User Objects for the Work we intend to do later:
            Group _AzureUsersgroup = azureAdFunctions.GetADGroup(AzureClientSession, config.AzureADGroupsGroup, Logger);

            if (_AzureUsersgroup != null)
            {
                List <Tuple <string, IDirectoryObject> > _AzureGroupMembers = azureAdFunctions.GetAdGroupMembers(_AzureUsersgroup, config, Logger);

                if (_AzureGroupMembers.Any(members => members.Item1 == "group"))
                {
                    List <IGroup> _AzureGroupGroups = _AzureGroupMembers.Where(member => member.Item1.Equals("group"))
                                                      .Select(member => member.Item2)
                                                      .Select(member => member as IGroup)
                                                      .ToList();

                    List <DirectoryEntry> _OnPremContactObjects = onPremAdFunctions.GetOUContactObjects(config.FQDomainName, config.GroupsDestinationOUDN, onPremAdHelper, Logger);

                    #region Add Contact Objects to AD Contacts OU
                    //foreach group in Cloud check if they reside onprem and add them if they dont.

                    if (config.AllowCreationOfADObjects)
                    {
                        Dictionary <string, IGroup> azureGroups = _AzureGroupGroups.Where(x => x.Mail != null)
                                                                  .ToDictionary(x => x.Mail.ToLower(), x => x);

                        foreach (string OnPremUser in _OnPremContactObjects.Where(x => x.Properties["Mail"].Value != null)
                                 .Select(x => x.Properties["Mail"].Value.ToString()))
                        {
                            azureGroups.Remove(OnPremUser.ToLower());
                        }

                        int CreatedUsers = onPremAdFunctions.CreateADGroupContacts(Logger, config, _OnPremGroupsDirectoryEntry, onPremAdHelper, azureGroups);

                        Logger.Debug(String.Format("Created {0} group(s) in On-Prem Active Directory", CreatedUsers.ToString()));
                        Console.WriteLine("Created {0} group(s) in On-Prem Active Directory", CreatedUsers.ToString());
                    }
                    #endregion

                    #region Delete Group Objects from AD OU

                    //foreach group onprem check if they reside in cloud - delete them from AD if they dont (Make this over-rideable with a key)
                    if (config.AllowDeletionOfADObjects)
                    {
                        Dictionary <string, DirectoryEntry> onpremGroups = _OnPremContactObjects.Where(y => y.Properties["Mail"].Value != null)
                                                                           .ToDictionary(y => y.Properties["Mail"].Value.ToString().ToLower(), y => y);

                        foreach (string AzureUser in _AzureGroupGroups.Where(y => y.Mail != null)
                                 .Select(y => y.Mail.ToLower()))
                        {
                            onpremGroups.Remove(AzureUser.ToLower());
                        }

                        int DeletedGroups = onPremAdFunctions.DeleteADContacts(Logger, config, _OnPremGroupsDirectoryEntry, onpremGroups);

                        Logger.Debug(String.Format("Deleted {0} group(s) in On-Prem Active Directory", DeletedGroups.ToString()));
                        Console.WriteLine("Deleted {0} group(s) in On-Prem Active Directory", DeletedGroups.ToString());
                    }
                }
                else
                {
                    Console.WriteLine("Could not find any GROUP objects in group {0}", config.AzureADUserGroup);
                    Logger.Error(String.Format("Could not find any GROUP objects in group {0}", config.AzureADUserGroup));
                }
            }
            else
            {
                Console.WriteLine("Could not find Group in Azure ({0} to enumerate users from", config.AzureADUserGroup);
                Logger.Error(String.Format("Could not find Group in Azure ({0} to enumerate users from", config.AzureADUserGroup));
            }

            //Close AD Directory Entry Handle
            onPremAdHelper.DisposeADDirectoryEntry(_OnPremGroupsDirectoryEntry, Logger);

            Console.WriteLine("Group Creation/Deletion complete - Changes will be reflected on Office365 Sync on Next Dir-Sync Cycle but may not appear in Address book until the following day.");
            Logger.Debug(@"Group Creation/Deletion complete - Changes will be reflected on Office365 upon next DirSync.");

            #endregion
        }
예제 #17
0
 /// <summary>
 /// Creates a new user in the system.
 /// </summary>
 /// <param name="newUser">The new user.</param>
 /// <returns>The created user.</returns>
 public UserAccount Create(AzureUser newUser)
 {
     return(DoCreate(newUser));
 }
예제 #18
0
        private void GenerateSampleData()
        {
            for (int i = 0; i < 200; i++)
            {
                //Create Users
                string    rndUser = RandomString(5);
                AzureUser au      = new AzureUser
                {
                    SessionTimeout = 60,
                    IsLockedOut    = false,
                    IsOnline       = false,
                    //Timestamp = DateTime.Now,
                    LastActivityDate        = DateTime.Now,
                    LastLockoutDate         = new DateTime(1900, 1, 1),
                    LastPasswordChangedDate = new DateTime(1900, 1, 1),
                    LastLoginDate           = new DateTime(1900, 1, 1),
                    RealName     = rndUser,
                    Email        = rndUser + "@testuserdomain.com",
                    CreationDate = DateTime.Now,
                    IsApproved   = true,
                    Password     = "******",
                    Username     = rndUser + "@testuserdomain.com",
                    PartitionKey = rndUser.Substring(0, 1),
                    RowKey       = Guid.NewGuid().ToString()
                };
                new AzureUserRepository().Save(au);

                string    UID = Guid.NewGuid().ToString();
                AzureRole arm = new AzureRole
                {
                    RowKey       = UID,
                    RoleName     = "RegisteredUser",
                    PartitionKey = UID.Substring(0, 1),
                    UserRowKey   = au.RowKey,
                    Timestamp    = DateTime.Now
                };

                new AzureRoleRepository().Save(arm);

                //Create Companies
                string rndCompanyName = RandomString(5);
                var    company        = new CompanyModel(au.RowKey, rndCompanyName, "sales@" + rndCompanyName + ".com", "accounts@" + rndCompanyName + ".com", i.ToString());
                company.Country = "South Africa";
                new CompanyRepository().Save(company);

                //Create 10 Products
                for (int x = 0; x < 10; x++)
                {
                    ProductModel product;
                    byte[]       photo       = null;
                    Thread       printThread = new Thread(() =>
                    {
                        photo = CreateImage(RandomString(2));
                    });

                    printThread.SetApartmentState(ApartmentState.STA);
                    printThread.Start();
                    printThread.Join();

                    string CatID    = GetRandomCategory(categoryList);
                    string photoUrl = new PhotoRepository().SavePhoto(photo, Guid.NewGuid().ToString() + "_Test.png");
                    product                      = new ProductModel(RandomString(6), NextLoremIpsum(10), photoUrl, company.RowKey);
                    product.CategoryID           = CatID;
                    product.Description          = product.Description + " " + CatID;
                    product.FobPrice             = RandomInt().ToString();
                    product.MinimumOrderQuantity = RandomInt();
                    product.ModelNumber          = RandomInt().ToString();
                    product.PackagingAndDelivery = NextLoremIpsum(3);
                    product.PaymentTerms         = NextLoremIpsum(4);
                    product.PlaceOfOrigin        = NextLoremIpsum(2);
                    product.Port                 = NextLoremIpsum(1);
                    product.Quality              = NextLoremIpsum(2);
                    product.Specifications       = NextLoremIpsum(2);
                    product.SupplyAbility        = NextLoremIpsum(2);
                    product.Colour               = NextLoremIpsum(1);
                    product.BrandName            = NextLoremIpsum(1);

                    new ProductRepository().Save(product);
                }
            }
        }
예제 #19
0
        public async Task <AzureUser> CreateUser(string ukprn)
        {
            AzureUser user = null;

            var organisation = await _organisationsApiClient.Get(ukprn);

            var emailForOrganisation = $"api+donotreplyto-{organisation.EndPointAssessorOrganisationId}@education.gov.uk";

            IEnumerable <AzureUser> ukprnUsers = await GetUserDetailsByUkprn(ukprn, true, true);

            var ukprnUsersWithSubscription = (from u in ukprnUsers
                                              from subs in ukprnUsers.SelectMany(au => au.Subscriptions.Where(s => s.IsActive && s.ProductId == _productId))
                                              where u.Id == subs.UserId
                                              select u).ToList();

            AzureUser emailUser = await GetUserDetailsByEmail(emailForOrganisation, true, true);

            AzureUser ukprnUser = ukprnUsersWithSubscription.FirstOrDefault(u => u.Email.Equals(emailForOrganisation));

            if (ukprnUsersWithSubscription.Any() && ukprnUser is null)
            {
                throw new Exceptions.EntityAlreadyExistsException($"Access is already enabled.");
            }
            else if (ukprnUser != null)
            {
                user = ukprnUser;
            }
            else if (emailUser != null)
            {
                user = emailUser;
                await UpdateUserNote(user.Id, $"ukprn={ukprn}");
            }
            else
            {
                var request = new CreateAzureUserRequest
                {
                    FirstName = organisation.EndPointAssessorOrganisationId,
                    LastName  = organisation.EndPointAssessorName,
                    Email     = emailForOrganisation,
                    Note      = $"ukprn={ukprn}"
                };

                using (var httpRequest = new HttpRequestMessage(HttpMethod.Put, $"/users/{Guid.NewGuid()}?api-version=2017-03-01"))
                {
                    user = await PostPutRequestWithResponse <CreateAzureUserRequest, AzureUser>(httpRequest, request);
                }
            }

            if (user != null && !string.IsNullOrEmpty(user.Id))
            {
                if (!user.Groups.Any(g => string.Equals(g.Id, _groupId, StringComparison.InvariantCultureIgnoreCase)))
                {
                    await AddUserToGroup(user.Id, _groupId);
                }

                if (!user.Subscriptions.Any(s => string.Equals(s.ProductId, _productId, StringComparison.InvariantCultureIgnoreCase)))
                {
                    await SubscribeUserToProduct(user.Id, _productId);
                }

                await _organisationsApiClient.Update(new UpdateOrganisationRequest
                {
                    EndPointAssessorName           = organisation.EndPointAssessorName,
                    EndPointAssessorOrganisationId = organisation.EndPointAssessorOrganisationId,
                    EndPointAssessorUkprn          = organisation.EndPointAssessorUkprn,
                    ApiEnabled = true,
                    ApiUser    = user.Id
                });

                // Note: Multiple things could have happened by this point so refresh
                user = await GetUserDetails(user.Id, true, true);
            }

            return(user);
        }