public async Task <IActionResult> GenerateTokenAsync([FromBody] GenerateJwtModel generateJwtModel) { var generateJwtInfo = new GenerateJwtInfo { Audience = generateJwtOptions.Audience, Issuer = generateJwtOptions.Issuer, Secret = generateJwtOptions.Secret, Scopes = new[] { Policies.TodoItems.CreateTodoItem, Policies.TodoItems.DeleteTodoItem, Policies.TodoItems.GetTodoItems, Policies.TodoItems.UpdateTodoItem }, UserName = generateJwtModel.UserName, Password = generateJwtModel.Password }; JwtInfo jwtInfo = await generateJwtFlow.ExecuteAsync(generateJwtInfo, User); var jwtModel = new JwtModel { AccessToken = jwtInfo.AccessToken }; return(Ok(jwtModel)); }
public async Task <IActionResult> RegisterTeacher([FromBody] TeacherRegisterVM model) { return(await HandleRequestAsync(async() => { string imageName = Path.GetRandomFileName() + ".jpg"; var filePath = Path.Combine(Directory.GetCurrentDirectory(), @"wwwroot\Uploaded\Users"); string pathSaveImages = InitStaticFiles .CreateImageByFileName(_env, _configuration, new string[] { Directory.GetCurrentDirectory(), @"wwwroot", "Uploaded", "Users" }, imageName, model.Photo); //+38 (098) 665 34 18 model.Photo = imageName; var rezult = await _teacherService.Create(model); if (rezult) { var user = _userManager.FindByEmailAsync(model.Email).Result; var teacher = await _teacherService.GetTeacherById(user.Id); JwtInfo jwtInfo; if (teacher != null) { // Return token jwtInfo = new JwtInfo() { Token = _jwtTokenService.CreateToken(user), RefreshToken = _jwtTokenService.CreateRefreshToken(user), SchoolId = teacher.SchoolId.ToString() }; } else { // Return token jwtInfo = new JwtInfo() { Token = _jwtTokenService.CreateToken(user), RefreshToken = _jwtTokenService.CreateRefreshToken(user), }; } this._logger.LogDebug("End method LoginUser..."); return Ok(jwtInfo); } else { var invalid = new Dictionary <string, string> { { "email", "Користувач з даною електронною поштою уже зареєстрований" } }; return BadRequest(invalid); } })); }
private DBManager() { if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) { m_jwtPath = Path.Combine(Directory.GetCurrentDirectory(), "/" + m_dataPath + "/jwt.json"); m_dbPath = Path.Combine(Directory.GetCurrentDirectory(), "/" + m_dataPath + "/data.db"); } if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { var dataPath = Path.Combine(Directory.GetCurrentDirectory(), m_dataPath); if (!Directory.Exists(dataPath)) { Directory.CreateDirectory(dataPath); } m_jwtPath = Path.Combine(Directory.GetCurrentDirectory(), m_dataPath + "/jwt.json"); m_dbPath = Path.Combine(Directory.GetCurrentDirectory(), m_dataPath + "/data.db"); } if (!File.Exists(m_jwtPath)) { var bytes = new byte[128]; var ranndom = new Random(); ranndom.NextBytes(bytes); var key = Convert.ToBase64String(bytes); JWT = new JwtInfo() { ClockSkew = 10, Audience = "Inotify", Issuer = "Inotify", IssuerSigningKey = key, Expiration = 36000, }; File.WriteAllText(m_jwtPath, JsonConvert.SerializeObject(JWT)); } else { JWT = JsonConvert.DeserializeObject <JwtInfo>(File.ReadAllText(m_jwtPath)); } m_dbConnection = new SqliteConnection(string.Format("Data Source={0}", m_dbPath)); if (m_dbConnection.State == ConnectionState.Closed) { m_dbConnection.Open(); } DBase = new NPoco.Database(m_dbConnection, DatabaseType.SQLite); m_migrator = new Migrator(DBase); }
private void InitializeAppConfig() { EnvironmentName = Configuration["Startup:EnvironmentName"]; UseDeveloperExceptionPage = Convert.ToBoolean(Configuration["StartUp:UseDeveloperExceptionPage"]); LogRootPath = Configuration["LogRootPath"]; var issuer = Configuration["JWT:Issuer"]; var audience = Configuration["JWT:Audience"]; JwtInfo = new JwtInfo(issuer, audience); AppSecurity = new AppSecurity(this); }
public async Task <IActionResult> LoginUser([FromBody] LoginDTO loginModel) { // Auto return errors from viewModel and other global errors return(await HandleRequestAsync(async() => { int countOfAttempts = this.HttpContext.Session.GetInt32("LoginAttemts") ?? 0; countOfAttempts++; this.HttpContext.Session.SetInt32("LoginAttemts", countOfAttempts); this._logger.LogDebug("Start method LoginUser..."); var result = await _signInManager.PasswordSignInAsync(loginModel.Email, loginModel.Password, false, false); if (!result.Succeeded) { return BadRequest(new InvalidData { Invalid = "Не правильно введені дані", ShowCaptcha = countOfAttempts > 4 ? true : false }); } var user = await _userManager.FindByEmailAsync(loginModel.Email); await _signInManager.SignInAsync(user, isPersistent: false); if (countOfAttempts > 4) { // TODO: Captcha validation this._recaptchaService.IsValid(loginModel.RecaptchaToken); } // Return token JwtInfo jwtInfo = new JwtInfo() { Token = _jwtTokenService.CreateToken(user), RefreshToken = _jwtTokenService.CreateRefreshToken(user) }; this.HttpContext.Session.SetInt32("LoginAttemts", 0); this._logger.LogDebug("End method LoginUser..."); return Ok(jwtInfo); })); }
public async Task ExecuteAsync_WhenGenerateJwtInfoIsValid_ReturnsExpectedData() { // Arrange var expectedJwtInfo = new JwtInfo(); var jwtService = new Mock <IJwtService>(); jwtService.Setup(x => x.GenerateJwtAsync(It.IsAny <GenerateJwtInfo>())).ReturnsAsync(expectedJwtInfo); var logger = new Mock <ILogger <GenerateJwtFlow> >(); var generateJwtInfo = new GenerateJwtInfo(); var principal = new Mock <IPrincipal>(); principal.SetupGet(x => x.Identity).Returns(new GenericIdentity("test")); var generateJwtFlow = new GenerateJwtFlow(jwtService.Object, logger.Object); // Act var actualJwtInfo = await generateJwtFlow.ExecuteAsync(generateJwtInfo, principal.Object); // Assert actualJwtInfo.Should().BeEquivalentTo(expectedJwtInfo, $"because {nameof(GenerateJwtFlow)} works"); }
public async Task <IActionResult> LoginUser([FromBody] LoginDTO loginModel) { // Auto return errors from viewModel and other global errors return(await HandleRequestAsync(async() => { int countOfAttempts = this.HttpContext.Session.GetInt32("LoginAttemts") ?? 0; countOfAttempts++; this.HttpContext.Session.SetInt32("LoginAttemts", countOfAttempts); this._logger.LogDebug("Start method LoginUser..."); var result = await _signInManager.PasswordSignInAsync(loginModel.Email, loginModel.Password, false, false); if (!result.Succeeded) { var invalid = new Dictionary <string, string> { { "email", "Не правильно введені дані" }, { "showCaptcha", (countOfAttempts > 4 ? true : false).ToString() } }; return BadRequest(invalid); //return BadRequest(new InvalidData //{ // Invalid = "Не правильно введені дані", // ShowCaptcha = countOfAttempts > 4 ? true : false //}); } var user = await _userManager.FindByEmailAsync(loginModel.Email); await _signInManager.SignInAsync(user, isPersistent: false); //if (countOfAttempts > 4) //{ // // TODO: Captcha validation // this._recaptchaService.IsValid(loginModel.RecaptchaToken); //} var teacher = await _teacherService.GetTeacherById(user.Id); // Return token JwtInfo jwtInfo; if (teacher != null) { // Return token jwtInfo = new JwtInfo() { Token = _jwtTokenService.CreateToken(user), RefreshToken = _jwtTokenService.CreateRefreshToken(user), SchoolId = teacher.SchoolId.ToString() }; } else { // Return token jwtInfo = new JwtInfo() { Token = _jwtTokenService.CreateToken(user), RefreshToken = _jwtTokenService.CreateRefreshToken(user), }; } this.HttpContext.Session.SetInt32("LoginAttemts", 0); this._logger.LogDebug("End method LoginUser..."); return Ok(jwtInfo); })); }
public IActionResult SetJWT(JwtInfo jwt) { DBManager.Instance.JWT = jwt; StartUpManager.Load().Restart(); return(OK()); }
public async Task <IActionResult> RegisterUser([FromBody] RegisterDTO model) { // Auto return errors from viewModel and other global errors return(await HandleRequestAsync(async() => { if (!CaptchaHelper.VerifyAndExpireSolution(this.HttpContext, model.CaptchaKey, model.CaptchaText)) { var invalid = new Dictionary <string, string>(); invalid.Add("captchaText", "Помилка вводу зображення на фото"); return BadRequest(invalid); } var user = _userManager.FindByEmailAsync(model.Email).Result; if (user != null) { var invalid = new Dictionary <string, string>(); invalid.Add("email", "Користувач з даною електронною поштою уже зареєстрований"); return BadRequest(invalid); } string imageName = Path.GetRandomFileName() + ".jpg"; try { this._logger.LogDebug("Start register method RegisterUser..."); string pathSaveImages = InitStaticFiles .CreateImageByFileName(_env, _configuration, new string[] { "ImagesPath", "ImagesPathUser" }, imageName, model.Photo); this._logger.LogDebug("Save image complete method RegisterUser..."); if (pathSaveImages != null) { var profile = new UserProfile() { RegistrationDate = DateTime.Now, FirstName = model.FirstName, LastName = model.LastName, Photo = imageName, }; user = new DbUser() { UserName = model.Email, Email = model.Email, PhoneNumber = model.Phone, UserProfile = profile }; var result = _userManager.CreateAsync(user, model.Password).Result; if (!result.Succeeded) { var errors = CustomValidator.GetErrorsByIdentityResult(result); return BadRequest(errors); } await _signInManager.SignInAsync(user, isPersistent: false); // Return token JwtInfo jwtInfo = new JwtInfo() { Token = _jwtTokenService.CreateToken(user), RefreshToken = _jwtTokenService.CreateRefreshToken(user) }; this._logger.LogDebug("End method RegisterUser..."); return Ok(jwtInfo); } else { throw new Exception("Помила додавання фото в БД"); } } catch (Exception ex) { InitStaticFiles.DeleteImageByFileName(_env, _configuration, new string[] { "ImagesPath", "ImagesPathUser" }, imageName); var errors = new Dictionary <string, string>(); errors.Add("invalid", ex.Message); return BadRequest(errors); } })); }
public async Task <IActionResult> SignIn(SignIn obj) { if (ModelState.IsValid) { string stringData = JsonSerializer.Serialize(obj); var contentData = new StringContent(stringData, System.Text.Encoding.UTF8, "application/json"); HttpResponseMessage responseMessage = await client.PostAsync(signinApiUrl, contentData); if (responseMessage.IsSuccessStatusCode) { string stringReturnData = await responseMessage.Content.ReadAsStringAsync(); var jwtHandler = new JwtSecurityTokenHandler(); var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; JwtInfo jwtInfo = JsonSerializer.Deserialize <JwtInfo>(stringReturnData, options); // Check Token Format if (!jwtHandler.CanReadToken(jwtInfo.token)) { ModelState.AddModelError("", "The token doesn't seem to be in a proper JWT format."); } else { var stream = jwtInfo.token; var jsonToken = jwtHandler.ReadToken(stream); var tokenS = jwtHandler.ReadToken(stream) as JwtSecurityToken; HttpContext.Session.SetString("token", jwtInfo.token); HttpContext.Session.SetString("username", obj.UserName); var claims = tokenS.Claims; var jwtPayload = "{"; foreach (Claim c in claims) { if (c.Type == "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name") { jwtInfo.UserName = c.Value; } else if (c.Type == "http://schemas.microsoft.com/ws/2008/06/identity/claims/role") { jwtInfo.UserRole = c.Value; } else if (c.Type == "FullName") { jwtInfo.FullName = c.Value; } jwtPayload += '"' + c.Type + "\":\"" + c.Value + "\","; } jwtPayload += "}"; HttpContext.Session.SetString("jwtPayload", jwtPayload); HttpContext.Session.SetString("userFullName", jwtInfo.FullName); //jwtInfo.UserName = tokenS.Claims.First(claim => claim.Type == "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name").Value; //jwtInfo.UserRole = tokenS.Claims.First(claim => claim.Type == "http://schemas.microsoft.com/ws/2008/06/identity/claims/role").Value; //jwtInfo.FullName = tokenS.Claims.First(claim => claim.Type == "FullName").Value; return(RedirectToAction("List", "EmployeeManager")); } } else { ModelState.AddModelError("", "Invalid user details"); } } return(View(obj)); }
public TokenService(IOptions <JwtInfo> jwtInfoOptions) { _jwtInfo = jwtInfoOptions.Value; }