Ejemplo n.º 1
0
        public async Task <IActionResult> Register(RegisterViewModel model, Uri returnUrl = null)
        {
            ViewData["Title"] = "Register";
            // ViewData["Menu"] = "navAccount";
            ViewData["ReturnUrl"] = returnUrl;
            if (ModelState.IsValid)
            {
                var user = new ApplicationUser
                {
                    UserName  = model?.UserName,
                    FirstName = model.FirstName,
                    LastName  = model.LastName,
                    Email     = model.Email
                };
                var result = await UserManagerAgent.CreateAsync(user, model.Password).ConfigureAwait(false);

                if (result.Succeeded)
                {
                    if (!await RoleManagerAgent.RoleExistsAsync(_appSettings.SecRole.Level1).ConfigureAwait(false))
                    {
                        ApplicationRole role = new ApplicationRole
                        {
                            Name        = _appSettings.SecRole.Level1,
                            Description = "Perform basic operations."
                        };
                        IdentityResult roleResult = await RoleManagerAgent.CreateAsync(role).ConfigureAwait(false);

                        if (!roleResult.Succeeded)
                        {
                            ModelState.AddModelError(string.Empty, "Error while creating role!");
                            return(View(model));
                        }
                    }
                    UserManagerAgent.AddToRoleAsync(user, _appSettings.SecRole.Level1).Wait();

                    // send confirmation email
                    string confirmationToken = await UserManagerAgent.GenerateEmailConfirmationTokenAsync(user).ConfigureAwait(false);

                    string confirmationLink = Url.Action("ConfirmEmail", "Account",
                                                         new { userid = user.Id, token = confirmationToken }, protocol: HttpContext.Request.Scheme);

                    string[] emailAddresses = { _appSettings.SMTP.AdminEmail, user.Email };
                    var      emailName      = string.IsNullOrWhiteSpace(user.FirstName) ? user.UserName : $"{user.FirstName} {user.LastName}".Trim();
                    await _emailAgent.SendEmailAsync(_appSettings.SMTP.FromEmail, _appSettings.SMTP.FromEmail, emailAddresses,
                                                     "Welcome to Winemakers Software - Please verify your email.", CreateVerifyEmail(confirmationLink, emailName), true, null).ConfigureAwait(false);

                    // redirect to limbo page
                    return(RedirectToAction("RegisterLimbo", "Account"));
                }
                AddErrors(result);
            }

            // If we got this far, something failed, redisplay form
            return(View(model));
        }
        /// <summary>
        /// Create a roles based access token with roles assigned by user
        /// </summary>
        /// <param name="user">User as <see cref="ApplicationUser"/></param>
        /// <param name="expireMinutes">Minutes Token will remain alive as <see cref="double?"/></param>
        /// <returns>JWT Token as <see cref="string"/></returns>
        protected async Task <string> CreateJwtTokenAsync(ApplicationUser user, double?expireMinutes = null)
        {
            if (string.IsNullOrWhiteSpace(user?.UserName))
            {
                return(null);
            }

            var claims = new List <Claim>
            {
                new Claim(JwtRegisteredClaimNames.Sub, user.UserName),
                new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
            };

            var userClaims = await UserManagerAgent.GetClaimsAsync(user).ConfigureAwait(false);

            var userRoles = await UserManagerAgent.GetRolesAsync(user).ConfigureAwait(false);

            claims.AddRange(userClaims);
            foreach (var userRole in userRoles)
            {
                claims.Add(new Claim(ClaimTypes.Role, userRole));
                var role = await RoleManagerAgent.FindByNameAsync(userRole).ConfigureAwait(false);

                if (role != null)
                {
                    var roleClaims = await RoleManagerAgent.GetClaimsAsync(role).ConfigureAwait(false);

                    foreach (Claim roleClaim in roleClaims)
                    {
                        claims.Add(roleClaim);
                    }
                }
            }

            double expirationMinutes = expireMinutes ?? double.Parse(ConfigurationAgent["JwtToken:ExpireMinutes"], CultureInfo.CurrentCulture);
            var    token             = new JwtSecurityToken
                                       (
                issuer: ConfigurationAgent["JwtToken:Issuer"],
                audience: ConfigurationAgent["JwtToken:Audience"],
                claims: claims,
                expires: DateTime.UtcNow.AddMinutes(expirationMinutes),
                notBefore: DateTime.UtcNow,
                signingCredentials: new SigningCredentials(
                    new SymmetricSecurityKey(Encoding.UTF8.GetBytes(ConfigurationAgent["JwtToken:Key"])), SecurityAlgorithms.HmacSha256)
                                       );

            return(new JwtSecurityTokenHandler().WriteToken(token));
        }
Ejemplo n.º 3
0
        public async Task <IActionResult> DeleteRole(string roleName)
        {
            var role = await RoleManagerAgent.FindByNameAsync(roleName).ConfigureAwait(false);

            if (role != null && role.Name != _appSettings.SecRole.Admin)
            {
                IdentityResult roleResult = await RoleManagerAgent.DeleteAsync(role).ConfigureAwait(false);

                if (!roleResult.Succeeded)
                {
                    throw new Exception(_localizer["ErrorDeleteRole"]);
                }
            }

            return(RedirectToAction("Index", "Admin", new { id = "roles" }));
        }
Ejemplo n.º 4
0
        public async Task <IActionResult> DeleteUserRole(UserViewModel model)
        {
            ViewData["Title"] = "Edit a User";

            var user = await UserManagerAgent.FindByNameAsync(model?.UserName).ConfigureAwait(false);

            if (await RoleManagerAgent.RoleExistsAsync(model.NewRole).ConfigureAwait(false) && await UserManagerAgent.IsInRoleAsync(user, model.NewRole).ConfigureAwait(false))
            {
                await UserManagerAgent.RemoveFromRoleAsync(user, model.NewRole).ConfigureAwait(false);
            }
            model = _mapper.Map <UserViewModel>(user);
            model.MemberRoles.AddRange(await UserManagerAgent.GetRolesAsync(user).ConfigureAwait(false));
            model.AllRoles.AddRange(GetAllRolesAsSelectList());

            return(View("EditUser", model));
        }
Ejemplo n.º 5
0
        public async Task <IActionResult> AddRole(ApplicationRole model)
        {
            if (model == null)
            {
                throw new ArgumentNullException(nameof(model));
            }

            // Create Role
            if (!await RoleManagerAgent.RoleExistsAsync(model.Name).ConfigureAwait(false))
            {
                IdentityResult roleResult = await RoleManagerAgent.CreateAsync(model).ConfigureAwait(false);

                if (!roleResult.Succeeded)
                {
                    Danger(_localizer["ErrorAddRole"], true);
                    return(View(model));
                }
            }

            return(RedirectToAction("Index", "Admin", new { id = "roles" }));
        }
Ejemplo n.º 6
0
        public async Task <IActionResult> Index(string id)
        {
            ViewData["Title"]    = _localizer["PageTitle"];
            ViewData["PageDesc"] = _localizer["PageDesc"];

            var getYeastQuery        = _yeastQueryFactory.CreateYeastsQuery();
            var getYeastPairs        = _yeastQueryFactory.CreateYeastPairQuery();
            var getCategoriesQuery   = _recipeQueryFactory.CreateCategoriesQuery();
            var getVarietiesQuery    = _recipeQueryFactory.CreateVarietiesQuery();
            var getRecipesQuery      = _recipeQueryFactory.CreateRecipesQuery();
            var getMaloCulturesQuery = _maloQueryFactory.CreateMaloCulturesQuery();
            var getJournalsQuery     = _journalQueryFactory.CreateBatchesQuery();

            // using TPL to parallel call gets
            List <Task> tasks = new List <Task>();

            var categoryTask = Task.Run(async() => await getCategoriesQuery.ExecuteAsync().ConfigureAwait(false));

            tasks.Add(categoryTask);
            var cList = await categoryTask.ConfigureAwait(false);

            var varietyTask = Task.Run(async() => await getVarietiesQuery.ExecuteAsync().ConfigureAwait(false));

            tasks.Add(varietyTask);
            var vList = await varietyTask.ConfigureAwait(false);

            var yeastTask = Task.Run(async() => await getYeastQuery.ExecuteAsync().ConfigureAwait(false));

            tasks.Add(yeastTask);
            var yList = await yeastTask.ConfigureAwait(false);

            var pairsTask = Task.Run(async() => await getYeastPairs.ExecuteAsync().ConfigureAwait(false));

            tasks.Add(pairsTask);
            var ypList = await pairsTask.ConfigureAwait(false);

            var recipeTask = Task.Run(async() => await getRecipesQuery.ExecuteAsync().ConfigureAwait(false));

            tasks.Add(recipeTask);
            var rList = await recipeTask.ConfigureAwait(false);

            var maloTask = Task.Run(async() => await getMaloCulturesQuery.ExecuteAsync().ConfigureAwait(false));

            tasks.Add(maloTask);
            var mList = await maloTask.ConfigureAwait(false);

            var journalTask = Task.Run(async() => await getJournalsQuery.ExecuteAsync().ConfigureAwait(false));

            tasks.Add(journalTask);
            var jList = await journalTask.ConfigureAwait(false);

            Task.WaitAll(tasks.ToArray());

            // build model
            var model = _modelFactory.CreateAdminModel(id);

            // make sure admin security role exist
            if (!await RoleManagerAgent.RoleExistsAsync(_appSettings.SecRole.Admin).ConfigureAwait(false))
            {
                ApplicationRole role = new ApplicationRole
                {
                    Name        = _appSettings.SecRole.Admin,
                    Description = "Perform all operations."
                };
                IdentityResult roleResult = await RoleManagerAgent.CreateAsync(role).ConfigureAwait(false);

                if (!roleResult.Succeeded)
                {
                    ModelState.AddModelError(string.Empty, "Error while creating role!");
                    return(View(model));
                }
            }

            // gather users data
            var users   = UserManagerAgent.Users.ToList();
            var userVms = _mapper.Map <List <UserViewModel> >(users);

            model.UsersViewModel.Users.Clear();
            model.UsersViewModel.Users.AddRange(userVms);

            foreach (var user in model.UsersViewModel.Users)
            {
                user.IsAdmin = await UserManagerAgent.IsInRoleAsync(user, _appSettings.SecRole.Admin).ConfigureAwait(false);

                user.IsLockedOut = await UserManagerAgent.IsLockedOutAsync(user).ConfigureAwait(false);
            }

            // gather roles data
            var roles = await RoleManagerAgent.Roles.OrderBy(r => r.Name).ToListAsync().ConfigureAwait(false);

            var roleVms = _mapper.Map <List <RoleViewModel> >(roles);

            model.RolesViewModel.Roles.Clear();
            model.RolesViewModel.Roles.AddRange(roleVms);

            // gather category / variety data
            model.CategoriesViewModel.Categories.Clear();
            model.CategoriesViewModel.Categories.AddRange(_modelFactory.CreateCategoryViewModel(cList));
            model.VarietiesViewModel.Varieties.Clear();
            model.VarietiesViewModel.Varieties.AddRange(_modelFactory.CreateVarietyViewModel(vList));

            // gather yeast data
            model.YeastsViewModel.Yeasts.Clear();
            model.YeastsViewModel.Yeasts.AddRange(_modelFactory.CreateYeastViewModel(yList));

            // gather malolactic data
            model.MaloCulturesViewModel.Cultures.Clear();
            model.MaloCulturesViewModel.Cultures.AddRange(_modelFactory.CreateMaloCultureViewModel(mList));

            // gather recipe data
            model.RecipesViewModel.Recipes.Clear();
            model.RecipesViewModel.Recipes.AddRange(_modelFactory.CreateRecipeViewModel(rList));

            // gather journal data
            model.JournalsViewModel.Journals.Clear();
            model.JournalsViewModel.Journals.AddRange(_modelFactory.CreateJournalViewModel(jList, userVms));

            return(View(model));
        }