Beispiel #1
0
        public void Authentication_should_success_with_updated_password()
        {
            var user = new CcmUser
            {
                UserName  = $"User{DateTime.Now:yyyyMMddHHmmss}",
                FirstName = "Förnamn",
                LastName  = "Efternamn",
                Password  = "******",
                Comment   = "Testanvändare"
            };

            var createResult = _sut.Create(user);

            Assert.IsTrue(createResult);

            Assert.IsTrue(_sut.AuthenticateAsync(user.UserName, "Prinskorv").Result);

            user.Password = "******";
            var updateResult = _sut.Update(user);

            Assert.IsTrue(updateResult);

            Assert.IsFalse(_sut.AuthenticateAsync(user.UserName, "Prinskorv").Result);
            Assert.IsTrue(_sut.AuthenticateAsync(user.UserName, "Grynkorv").Result);

            // Clean up
            _sut.Delete(user.Id);
        }
Beispiel #2
0
        public void Delete(CcmUser ccmUser)
        {
            if (ccmUser == null)
            {
                throw new ArgumentNullException("ccmUser");
            }

            using (var db = GetDbContext())
            {
                UserEntity user = db.Users.SingleOrDefault(u => u.Id == new Guid(ccmUser.Id));

                if (user != null)
                {
                    if (user.RegisteredSips != null)
                    {
                        user.RegisteredSips.Clear();
                    }

                    db.Users.Remove(user);
                    db.SaveChanges();
                }
                else
                {
                    log.Info(string.Format("Could not find user {0}", ccmUser.Id));
                }
            }
        }
Beispiel #3
0
        private async Task <ActionResult> TryLogin(LoginViewModel model, string returnUrl)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    CcmUser user = model.LocalUser
                        ? await _userManager.FindLocalAsync(model.UserName, model.Password)
                        : await _userManager.FindAsync(model.UserName, model.Password);

                    if (user != null)
                    {
                        await SignInAsync(user, model.RememberMe);

                        return(RedirectToLocal(returnUrl));
                    }
                    ModelState.AddModelError(string.Empty, Resources.Invalid_Username_Password);
                }
                catch (Exception ex)
                {
                    ModelState.AddModelError(string.Empty, Resources.Invalid_Username_Password);
                }
            }

            return(View(model));
        }
        public ActionResult Edit(string id)
        {
            CcmUser user = _userManager.GetUser(id);

            if (user == null)
            {
                return(RedirectToAction("Index"));
            }

            var model = new UserFormViewModel
            {
                AccountLocked = user.AccountLocked,
                Comment       = user.Comment,
                DisplayName   = user.DisplayName,
                FirstName     = user.FirstName,
                Id            = user.Id,
                RadiusId      = user.RadiusId,
                LastName      = user.LastName,
                UserName      = user.UserName,
                UserType      = user.UserType,
                RoleId        = user.RoleId,
                OwnerId       = user.Owner != null ? user.Owner.Id : Guid.Empty,
                CodecTypeId   = user.CodecType != null ? user.CodecType.Id : Guid.Empty,
            };

            SetListData(model);

            return(View(model));
        }
Beispiel #5
0
        public IHttpActionResult Delete(string userName)
        {
            if (string.IsNullOrWhiteSpace(userName))
            {
                return(BadRequest("User name missing"));
            }

            CcmUser user = _userManager.FindByUserName(userName);

            if (user == null)
            {
                return(NotFound());
            }

            try
            {
                if (!_userManager.Delete(user))
                {
                    return(InternalServerError(new ApplicationException("User not deleted")));
                }

                return(Ok("User deleted"));
            }
            catch (Exception ex)
            {
                log.Error("Could not delete user", ex);
                return(InternalServerError(new ApplicationException("User could not be deleted. " + ex.Message)));
            }
        }
Beispiel #6
0
        public void Create(CcmUser user, string password, bool currentUserIsLocalAdmin = false)
        {
            if (_radiusUserRepository.UserExists(user.UserName))
            {
                log.Warn("Can't create user. Username {0} already exists in RADIUS database", user.UserName);
                throw new ApplicationException("Användarnamnet finns redan i RADIUS databas.");
            }

            if (_userRepository.FindByUserName(user.UserName) != null)
            {
                log.Warn("Can't create user. Username {0} already exists in CCM database", user.UserName);
                throw new ApplicationException("Användarnamnet finns redan i CCMs databas.");
            }

            log.Debug("Creating user in radius.");
            user.RadiusId = _radiusUserRepository.CreateUser(user.UserName, password, user.UserType);

            if (user.RadiusId <= 0)
            {
                throw new ApplicationException("Användaren kunde inte skapas i RADIUS.");
            }

            log.Debug("Creating user in ccm db");
            _userRepository.Create(user, currentUserIsLocalAdmin);
        }
Beispiel #7
0
        public ActionResult Edit(Guid id)
        {
            CcmUser user = _userRepository.GetById(id);

            if (user == null)
            {
                return(RedirectToAction("Index"));
            }

            var model = new UserFormViewModel
            {
                Comment   = user.Comment,
                FirstName = user.FirstName,
                Id        = user.Id,
                LastName  = user.LastName,
                UserName  = user.UserName,
                RoleId    = user.RoleId,
            };

            var userIsAdmin = User.IsInRole(Roles.Admin);

            model.Roles   = GetRoles(userIsAdmin);
            ViewBag.Title = Resources.Edit_User;
            return(View("CreateEdit", model));
        }
Beispiel #8
0
        private void CcmUserToUser(CcmDbContext cxt, CcmUser ccmUser, UserEntity dbUser, bool currentUserLocalAdmin = false)
        {
            dbUser.RadiusId    = ccmUser.RadiusId;
            dbUser.Comment     = ccmUser.Comment;
            dbUser.DisplayName = ccmUser.DisplayName;
            dbUser.FirstName   = ccmUser.FirstName;
            dbUser.LastName    = ccmUser.LastName;
            dbUser.Id          = new Guid(ccmUser.Id);
            dbUser.UserName    = ccmUser.UserName;
            dbUser.UserType    = ccmUser.UserType;
            dbUser.Owner       = ccmUser.Owner != null?cxt.Owners.SingleOrDefault(o => o.Id == ccmUser.Owner.Id) : null;

            dbUser.LocalUser = ccmUser.LocalUser;
            dbUser.CodecType = ccmUser.CodecType != null?cxt.CodecTypes.SingleOrDefault(c => c.Id == ccmUser.CodecType.Id) : null;

            dbUser.AccountLocked = ccmUser.AccountLocked;
            dbUser.UpdatedBy     = ccmUser.UpdatedBy;
            dbUser.UpdatedOn     = DateTime.UtcNow;
            ccmUser.UpdatedOn    = dbUser.UpdatedOn;

            var role = string.IsNullOrWhiteSpace(ccmUser.RoleId) ? null : cxt.Roles.SingleOrDefault(r => r.Id == new Guid(ccmUser.RoleId));

            // Only admins allowed to assign admin role to account
            if (currentUserLocalAdmin || role == null || role.Name != ApplicationConstants.Admin)
            {
                dbUser.Role = role;
            }
        }
Beispiel #9
0
        private async Task SignInAsync(CcmUser user, bool isPersistent)
        {
            AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
            ClaimsIdentity identity = await _userManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);

            AuthenticationManager.SignIn(new AuthenticationProperties {
                IsPersistent = isPersistent
            }, identity);
        }
Beispiel #10
0
 public bool Delete(CcmUser user)
 {
     if (_radiusUserRepository.DeleteUser(user.RadiusId))
     {
         _userRepository.Delete(user);
         return(true);
     }
     return(false);
 }
Beispiel #11
0
        public ActionResult Delete(DeleteUserViewModel model)
        {
            CcmUser user = _userManager.GetUser(model.Id);

            if (user != null)
            {
                _userManager.Delete(user);
            }

            return(RedirectToAction("Index"));
        }
Beispiel #12
0
        public CcmRole GetUserRole(CcmUser ccmUser)
        {
            using (var db = GetDbContext())
            {
                var user = db.Users.SingleOrDefault(u => u.Id == ccmUser.Id);

                return(user?.Role == null ? null : new CcmRole {
                    Id = user.Role.Id, Name = user.Role.Name
                });
            }
        }
Beispiel #13
0
 public void Update(CcmUser ccmUser, bool currentUserLocalAdmin = false)
 {
     using (var db = GetDbContext())
     {
         UserEntity dbUser = db.Users.SingleOrDefault(u => u.Id == new Guid(ccmUser.Id));
         if (dbUser != null)
         {
             CcmUserToUser(db, ccmUser, dbUser, currentUserLocalAdmin);
             db.SaveChanges();
         }
     }
 }
Beispiel #14
0
        public bool Create(CcmUser ccmUser)
        {
            using (var db = GetDbContext())
            {
                var dbUser = new UserEntity();
                MapUserEntity(db, ccmUser, dbUser);

                db.Users.Add(dbUser);
                var result = db.SaveChanges();
                ccmUser.Id = dbUser.Id;
                return(result >= 1);
            }
        }
Beispiel #15
0
        public ActionResult Save(UserFormViewModel model)
        {
            bool newUser = model.Id == Guid.Empty;

            try
            {
                if (ModelState.IsValid)
                {
                    var user = new CcmUser
                    {
                        Id        = model.Id,
                        UserName  = model.UserName.Trim(),
                        FirstName = model.FirstName ?? string.Empty,
                        LastName  = model.LastName ?? string.Empty,
                        Comment   = model.Comment ?? string.Empty,
                        RoleId    = model.RoleId,
                        Password  = model.Password
                    };

                    if (newUser)
                    {
                        if (_userRepository.GetByUserName(user.UserName) != null)
                        {
                            log.Warn("Can't create user. Username {0} already exists in CCM database", user.UserName);
                            ModelState.AddModelError("SaveUser", Resources.User_Name_Already_Taken);
                        }
                        else
                        {
                            _userRepository.Create(user);
                            return(RedirectToAction("Index"));
                        }
                    }
                    else
                    {
                        _userRepository.Update(user);
                        return(RedirectToAction("Index"));
                    }
                }
            }
            catch (Exception ex)
            {
                log.Error(ex, "Could not save user");
                ModelState.AddModelError("SaveUser", Resources.User_could_not_be_saved);
            }

            var userIsAdmin = User.IsInRole(Roles.Admin);

            model.Roles   = GetRoles(userIsAdmin);
            ViewBag.Title = newUser ? Resources.New_User : Resources.Edit_User;
            return(View("CreateEdit", model));
        }
Beispiel #16
0
        private void SignIn(CcmUser user, bool isPersistent)
        {
            AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);

            ClaimsIdentity identity = new ClaimsIdentity(DefaultAuthenticationTypes.ApplicationCookie);

            identity.AddClaim(new Claim(ClaimTypes.Name, user.UserName));
            identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()));
            identity.AddClaim(new Claim("FullName", $"{user.FirstName} {user.LastName}".Trim()));
            identity.AddClaim(new Claim(ClaimTypes.Role, user.Role));

            AuthenticationManager.SignIn(new AuthenticationProperties {
                IsPersistent = isPersistent
            }, identity);
        }
Beispiel #17
0
        public IHttpActionResult Get(string username)
        {
            CcmUser user = _userManager.FindByUserName(username);

            if (user == null)
            {
                return(NotFound());
            }

            return(Ok(new UserModel()
            {
                UserName = user.UserName,
                DisplayName = user.DisplayName,
                Comment = user.Comment
            }));
        }
Beispiel #18
0
        public bool Update(CcmUser ccmUser)
        {
            using (var db = GetDbContext())
            {
                var dbUser = db.Users.SingleOrDefault(u => u.Id == ccmUser.Id);
                if (dbUser == null)
                {
                    return(false);
                }

                MapUserEntity(db, ccmUser, dbUser);

                var result = db.SaveChanges();
                return(result == 1);
            }
        }
Beispiel #19
0
        public ActionResult Delete(Guid id)
        {
            CcmUser user = _userRepository.GetById(id);

            if (user == null)
            {
                return(RedirectToAction("Index"));
            }

            var model = new DeleteUserViewModel
            {
                Id       = user.Id,
                UserName = user.UserName
            };

            return(View(model));
        }
Beispiel #20
0
        public ActionResult Delete(Guid id)
        {
            CcmUser user = _userManager.GetUser(id.ToString());

            if (user == null)
            {
                return(RedirectToAction("Index"));
            }

            var model = new DeleteUserViewModel
            {
                Id       = user.Id,
                UserName = user.UserName
            };

            return(View(model));
        }
Beispiel #21
0
        public List <CcmRole> GetUserRoles(CcmUser ccmUser)
        {
            using (var db = GetDbContext())
            {
                var user = db.Users.SingleOrDefault(u => u.Id == new Guid(ccmUser.Id));

                if (user == null || user.Role == null)
                {
                    return(new List <CcmRole>());
                }

                var ccmRoles = new List <CcmRole> {
                    new CcmRole(user.Role.Id.ToString(), user.Role.Name)
                };
                return(ccmRoles);
            }
        }
Beispiel #22
0
        public ActionResult Create(UserFormViewModel model)
        {
            if (ModelState.IsValid)
            {
                var user = new CcmUser
                {
                    Comment     = model.Comment,
                    DisplayName = model.DisplayName,
                    FirstName   = model.UserType != UserType.SIP ? model.FirstName : string.Empty,
                    Id          = Guid.NewGuid().ToString(),
                    LastName    = model.UserType != UserType.SIP ? model.LastName : string.Empty,
                    UserName    = model.UserName.Trim(),
                    UserType    = model.UserType,
                    Owner       = model.UserType == UserType.SIP ? _ownersRepository.GetById(model.OwnerId) : null,
                    CodecType   = model.UserType == UserType.SIP ? _codecTypeRepository.GetById(model.CodecTypeId) : null,
                    CreatedBy   = User.Identity.Name,
                    UpdatedBy   = User.Identity.Name,
                    RoleId      = model.RoleId
                };

                try
                {
                    var userIsLocalAdmin = _userManager.UserIsLocalAdmin(User.Identity.Name);
                    _userManager.Create(user, model.Password, userIsLocalAdmin);
                    return(RedirectToAction("Index"));
                }
                catch (Exception ex)
                {
                    log.Error("Could not create user", ex);
                    if (ex is ApplicationException)
                    {
                        ModelState.AddModelError("CreateUser", ex.Message);
                    }
                    else
                    {
                        ModelState.AddModelError("CreateUser", "Användaren kunde inte skapas");
                    }
                }
            }

            SetListData(model);

            return(View(model));
        }
        protected async Task <IPrincipal> AuthenticateAsync(string userName, string password, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            CcmUser user = null;

#if DEBUG
            if (userName == ApplicationSettings.DiscoveryUsername && password == ApplicationSettings.DiscoveryPassword)
            {
                // Always authenticated
                user = new CcmUser(userName);
            }
#endif

            if (user == null)
            {
                if (RadiusProvider.Authenticate(userName, password)) // TODO: Anropa asynkront
                {
                    user = GetUser(userName);
                }
            }

            if (user == null)
            {
                return(null);
            }

            List <Claim> claims = new List <Claim> {
                new Claim(ClaimTypes.Name, userName)
            };

            var role = GetUserRoles(user);

            if (role != null)
            {
                claims.Add(new Claim(ClaimTypes.Role, role.Name));
            }

            ClaimsIdentity identity = new ClaimsIdentity(claims, AuthenticationTypes.Basic);

            var principal = new ClaimsPrincipal(identity);
            return(principal);
        }
Beispiel #24
0
        public void Crud()
        {
            var user = new CcmUser
            {
                UserName  = $"User{DateTime.Now:yyyyMMddHHmmss}",
                FirstName = "Förnamn",
                LastName  = "Efternamn",
                Password  = "******",
                Comment   = "Testanvändare"
            };

            var createResult = _sut.Create(user);

            Assert.IsTrue(createResult);

            var user2 = _sut.GetById(user.Id);

            Assert.AreEqual("Förnamn", user2.FirstName);
            Assert.AreEqual("Efternamn", user2.LastName);
            Assert.AreEqual("Testanvändare", user2.Comment);
            Assert.AreEqual(user.UserName, user2.UserName);

            user2.FirstName = "Alvar";
            user2.LastName  = "Dysterkvist";

            var updateResult = _sut.Update(user2);

            Assert.IsTrue(updateResult);

            var user3 = _sut.GetById(user2.Id);

            Assert.AreEqual("Alvar", user3.FirstName);
            Assert.AreEqual("Dysterkvist", user3.LastName);

            var deleteResult = _sut.Delete(user3.Id);

            Assert.IsTrue(deleteResult);

            var user4 = _sut.GetById(user3.Id);

            Assert.IsNull(user4);
        }
Beispiel #25
0
        public void Create(CcmUser ccmUser, bool currentUserLocalAdmin = false)
        {
            if (ccmUser == null)
            {
                throw new ArgumentNullException("ccmUser");
            }

            using (var db = GetDbContext())
            {
                var dbUser = new UserEntity();
                CcmUserToUser(db, ccmUser, dbUser, currentUserLocalAdmin);

                dbUser.CreatedBy  = ccmUser.CreatedBy;
                dbUser.CreatedOn  = DateTime.UtcNow;
                ccmUser.CreatedOn = dbUser.CreatedOn;

                db.Users.Add(dbUser);
                db.SaveChanges();
            }
        }
Beispiel #26
0
        //[RequireHttps]
        public ActionResult Edit(UserFormViewModel model)
        {
            if (ModelState.IsValid)
            {
                var user = new CcmUser();
                user.Comment     = model.Comment;
                user.DisplayName = model.DisplayName;
                user.FirstName   = model.UserType != UserType.SIP ? model.FirstName : string.Empty;
                user.Id          = model.Id;
                user.LastName    = model.UserType != UserType.SIP ? model.LastName : string.Empty;
                user.UserName    = model.UserName.Trim();
                user.UserType    = model.UserType;
                user.RadiusId    = model.RadiusId;
                user.Owner       = model.UserType == UserType.SIP ? _ownersRepository.GetById(model.OwnerId) : null;
                user.RoleId      = model.RoleId;
                user.CodecType   = model.UserType == UserType.SIP ? _codecTypeRepository.GetById(model.CodecTypeId) : null;
                user.UpdatedBy   = User.Identity.Name;

                try
                {
                    if (!string.IsNullOrWhiteSpace(model.Password) && user.RadiusId > 0)
                    {
                        _userManager.UpdatePassword(user.RadiusId, model.Password, user.UserType);
                    }

                    var currentUserLocalAdmin = _userManager.UserIsLocalAdmin(User.Identity.Name);
                    _userManager.Update(user, currentUserLocalAdmin);
                    return(RedirectToAction("Index"));
                }
                catch (Exception ex)
                {
                    ModelState.AddModelError("UpdatePassword", ex.Message);
                }
            }

            SetListData(model);

            return(View(model));
        }
Beispiel #27
0
        public void Update(CcmUser user, bool currentUserLocalAdmin = false)
        {
            var existingUser = _userRepository.GetUser(user.Id);

            // Endast lokal admin får tilldela admin-rollen
            var adminId = _roleRepository.GetRoleIdByName(ApplicationConstants.Admin).ToString();

            if (user.RoleId == adminId && existingUser.RoleId != adminId && !currentUserLocalAdmin)
            {
                throw new Exception("Endast Root-användaren får sätta Admin-rollen.");
            }

            if (existingUser.UserName != user.UserName)
            {
                if (!_radiusUserRepository.ChangeUserName(existingUser.RadiusId, user.UserName))
                {
                    throw new Exception("Unable to change username");
                }
            }

            _userRepository.Update(user, currentUserLocalAdmin);
        }
Beispiel #28
0
        public void Authenticate_with_password()
        {
            var user = new CcmUser
            {
                UserName  = $"User{DateTime.Now:yyyyMMddHHmmss}",
                FirstName = "Förnamn",
                LastName  = "Efternamn",
                Password  = "******",
                Comment   = "Testanvändare"
            };

            var createResult = _sut.Create(user);

            Assert.IsTrue(createResult);

            Assert.IsFalse(_sut.AuthenticateAsync("", "Pepparkaka").Result);
            Assert.IsFalse(_sut.AuthenticateAsync(user.UserName, "Lingonkaka").Result);
            Assert.IsTrue(_sut.AuthenticateAsync(user.UserName, "Pepparkaka").Result);

            // Clean up
            _sut.Delete(user.Id);
        }
Beispiel #29
0
        private void MapUserEntity(CcmDbContext cxt, CcmUser ccmUser, UserEntity dbUser)
        {
            dbUser.UserName  = ccmUser.UserName;
            dbUser.FirstName = ccmUser.FirstName;
            dbUser.LastName  = ccmUser.LastName;
            dbUser.Comment   = ccmUser.Comment;

            var role = string.IsNullOrWhiteSpace(ccmUser.RoleId) ? null : cxt.Roles.SingleOrDefault(r => r.Id == new Guid(ccmUser.RoleId));

            // Only admins allowed to assign admin role to account
            if (CurrentUserIsAdmin() || role == null || role.Name != Roles.Admin)
            {
                dbUser.Role = role;
            }

            if (!string.IsNullOrEmpty(ccmUser.Password))
            {
                var saltBytes = CryptoHelper.GenerateSaltBytes();
                dbUser.PasswordHash = CryptoHelper.Md5HashSaltedPassword(ccmUser.Password, saltBytes);
                dbUser.Salt         = Convert.ToBase64String(saltBytes);
            }
        }
Beispiel #30
0
        public IHttpActionResult Add(AddUserModel model)
        {
            log.Debug("Call to ExternalAccountController.AddUser");

            if (model == null)
            {
                return(BadRequest("Parameters missing."));
            }

            var user = new CcmUser
            {
                Id          = Guid.NewGuid().ToString(),
                UserName    = model.UserName.Trim(),
                DisplayName = model.DisplayName,
                Comment     = model.Comment,
                UserType    = UserType.SIP,
                Owner       = _ownersRepository.GetByName(ApplicationConstants.SrOwnerName),
                CodecType   = _codecTypeRepository.Find(ApplicationConstants.PersonligaCodecTypeName).FirstOrDefault(),
                CreatedBy   = User.Identity.Name,
                UpdatedBy   = User.Identity.Name
            };

            try
            {
                var existingUser = _userManager.FindByUserName(user.UserName);
                if (existingUser != null)
                {
                    return(Conflict());
                }

                _userManager.Create(user, model.Password);
                return(Created(Url.Content("get?username="******"User created"));
            }
            catch (Exception ex)
            {
                log.Error("Could not create user", ex);
                return(InternalServerError());
            }
        }