Exemplo n.º 1
0
        private JwtResponseData GenerateJwtToken(string email, RecipeUser user)
        {
            var claims = new List <Claim>
            {
                new Claim(JwtRegisteredClaimNames.Sub, email),
                new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
                new Claim(ClaimTypes.NameIdentifier, user.Id.ToString())
            };

            var key         = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(configuration["Auth:IssuerSigninKey"]));
            var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha512);
            var expires     = DateTime.Now.AddMinutes(5);

            var token = new JwtSecurityToken(
                claims: claims,
                expires: expires,
                signingCredentials: credentials
                );

            var tokenString = new JwtSecurityTokenHandler().WriteToken(token);

            return(new JwtResponseData
            {
                Expires = 5,
                Token = tokenString
            });
        }
Exemplo n.º 2
0
        public async Task <IActionResult> CreateUser([FromBody] RecipeUserView userView)
        {
            if (ModelState.IsValid)
            {
                RecipeUser user = await _recipeUser.FindByEmailAsync(userView.Email);

                if (user == null)
                {
                    user = new RecipeUser
                    {
                        Email     = userView.Email,
                        UserName  = userView.UserName,
                        FirstName = userView.FirstName,
                        LastName  = userView.LastName
                    };
                    var result = await _recipeUser.CreateAsync(user, userView.Password);

                    if (result == IdentityResult.Success)
                    {
                        return(Ok());
                    }
                }
            }
            return(BadRequest());
        }
Exemplo n.º 3
0
        public async Task <IActionResult> Register([FromBody] RegisterDto register)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            if (userManager.Users.Any(db => db.Email == register.Email || db.UserName == register.Email))
            {
                return(BadRequest("Woops!! Something went wrong!")); // we do not want to disclose that the 'email' is registered..
            }
            var user = new RecipeUser
            {
                Email    = register.Email,
                UserName = register.Email
            };

            var result = await userManager.CreateAsync(user, register.Password);

            if (!result.Succeeded)
            {
                return(BadRequest(result.Errors));
            }

            await signInManager.SignInAsync(user, false);

            return(Ok(GenerateJwtToken(register.Email, user)));
        }
Exemplo n.º 4
0
        public async Task <IActionResult> SignUp([FromBody] SessionSignUp signUp)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            // check if username exists
            if ((await recipeBookDataManager.Users.GetItemsAsync(c => c.Username == signUp.Username)).Any())
            {
                return(BadRequest("Username already exists"));
            }

            var passwordHash = HashPassword(signUp.Password);

            var newUser = new RecipeUser
            {
                FullName       = signUp.Fullname,
                Username       = signUp.Username,
                PasswordSecret = passwordHash.Item1,
                PasswordHash   = passwordHash.Item2
            };

            var newUserId = await recipeBookDataManager.Users.CreateItemAsync(newUser);

            newUser.Id = newUserId;

            var token = GenerateToken(newUser);

            return(Ok(new
            {
                token
            }));
        }
Exemplo n.º 5
0
        public async Task Should_Be_Able_To_Create_User_With_Valid_UserName_and_Password()
        {
            var testUser = new RecipeUser
            {
                UserName = "******"
            };
            var result = await _manager.CreateAsync(testUser, "P@ssw0rd1!");

            Assert.That(result.Succeeded, Is.True);
            var user = await _manager.FindByNameAsync(testUser.UserName);

            Assert.That(user.UserName, Is.EqualTo(testUser.UserName));
        }
Exemplo n.º 6
0
        private bool IsPasswordValid(RecipeUser recipeUser, string password)
        {
            var userSalt = Convert.FromBase64String(recipeUser.PasswordSecret);

            string passwordHash = Convert.ToBase64String(KeyDerivation.Pbkdf2(
                                                             password: password,
                                                             salt: userSalt,
                                                             prf: KeyDerivationPrf.HMACSHA1,
                                                             iterationCount: 10000,
                                                             numBytesRequested: 256 / 8));

            return(passwordHash == recipeUser.PasswordHash);
        }
Exemplo n.º 7
0
        public async Task SeedDataAsync()
        {
            RecipeUser user = await _userManager.FindByEmailAsync("*****@*****.**");

            if (user == null)
            {
                user = new RecipeUser()
                {
                    LastName  = "Andersson",
                    FirstName = "David",
                    Email     = "*****@*****.**",
                    UserName  = "******"
                };

                var result = await _userManager.CreateAsync(user, "Welc0me!");

                if (result != IdentityResult.Success)
                {
                    throw new InvalidOperationException("Could not create user in Seeding");
                }
            }

            if (_context.Categories.Any())
            {
                return;
            }

            var categories = new Category[]
            {
                new Category {
                    Name = "Kött"
                },
                new Category {
                    Name = "Fisk"
                },
                new Category {
                    Name = "Fågel"
                },
                new Category {
                    Name = "Vegetariskt"
                }
            };

            foreach (Category c in categories)
            {
                _context.Categories.Add(c);
            }
            _context.SaveChanges();
        }
Exemplo n.º 8
0
        private string GenerateToken(RecipeUser recipeUser)
        {
            var claims = new[]
            {
                new Claim(ClaimTypes.Sid, recipeUser.Id),
                new Claim(ClaimTypes.Name, recipeUser.Username),
                new Claim(ClaimTypes.GivenName, recipeUser.FullName)
            };

            var key   = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(signingCred.Value.TokenSecret));
            var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

            var token = new JwtSecurityToken(
                issuer: signingCred.Value.TokenAuthority,
                audience: signingCred.Value.TokenAuthority,
                claims: claims,
                expires: DateTime.Now.AddMinutes(30),
                signingCredentials: creds);

            return(new JwtSecurityTokenHandler().WriteToken(token));
        }
Exemplo n.º 9
0
        // This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc()
            .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

            IConfigurationSection recipeDbConfig = _config.GetSection("RecipeDb");
            var recipeDbService = InitializeRecipeDbService(recipeDbConfig, out DocumentClient dbClient);

            services.AddSingleton <IRecipeDbService>(recipeDbService);

            services.AddIdentity <RecipeUser, IdentityRole>()
            .AddDefaultUI(UIFramework.Bootstrap4)
            .RegisterDocumentDBStores <RecipeUser, IdentityRole>(dbClient,
                                                                 (p) => _collection)
            .AddDefaultTokenProviders();
            services.AddLogging();

// TODO: Remove after adding registration support
#if DEBUG
            var provider    = services.BuildServiceProvider();
            var userManager = provider.GetRequiredService <UserManager <RecipeUser> >();

            RecipeUser firstUser = new RecipeUser {
                UserName = "******"
            };
            var user = userManager.FindByNameAsync(firstUser.UserName).GetAwaiter().GetResult();
            if (user == null)
            {
                var result = userManager.CreateAsync(firstUser, "P@ssw0rd!").GetAwaiter().GetResult();
                if (!result.Succeeded)
                {
                    throw new InvalidOperationException("User not created");
                }
            }
#endif
        }