public async Task <IActionResult> Login([FromBody] UserLoginDto model)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            var result = await signInManager.PasswordSignInAsync(model.Email, model.Password, false, false);

            if (result.Succeeded)
            {
                //sending response if succeeded
                var appUser = userManager.Users.Single(r => r.Email == model.Email);
                if (appUser.IsBlocked)
                {
                    return(Unauthorized("Sorry! your account is blocked!"));
                }
                var token = await GenerateJwtToken(model.Email, appUser);

                var response = new TokenResponseDto
                {
                    Token = token,
                    Email = model.Email,
                    Role  = model.Role
                };
                return(Ok(response));
            }
            return(BadRequest("Oops! Login failed. Please enter correct email and password."));
        }
        private async Task GetDeviceData(TokenResponseDto token)
        {
            var client  = new RestClient("https://api.netatmo.com");
            var request = new RestRequest("/api/getstationsdata");

            request.AddQueryParameter("access_token", token.AccessToken);

            var data = await client.GetTaskAsync <StationDataResponseDto>(request);

            if (data?.Body?.Devices == null)
            {
                return;
            }

            lock (_deviceLock)
            {
                foreach (var dataDevice in data.Body.Devices)
                {
                    var station = dataDevice.StationName;
                    dataDevice.BatteryPercent = 100;

                    UpdateDevice(station, dataDevice);

                    if (dataDevice.Modules == null)
                    {
                        continue;
                    }

                    foreach (var module in dataDevice.Modules)
                    {
                        UpdateDevice(station, module);
                    }
                }
            }
        }
예제 #3
0
        public void GivenWrongAuthenticationResult_WhenMapping_ThenGetFailure(AuthenticateResult authResult)
        {
            var dto = TokenResponseDto.Create(authResult, Username);

            dto.Failure.Should().NotBeNull();
            ((int)dto.Failure).Should().Be((int)authResult);
        }
예제 #4
0
        public void GivenGoodAuthenticationResult_WhenMapping_ThenGetSuccess()
        {
            var authResult = AuthenticateResult.Ok;

            var dto = TokenResponseDto.Create(authResult, Username);

            dto.Failure.Should().BeNull();
        }
예제 #5
0
        private TokenResponseDto SetResponse(string token, bool authenticated, DateTime?createDate, DateTime?expirationDate, string message)
        {
            TokenResponseDto response = new TokenResponseDto
            {
                AccessToken    = token,
                Authenticated  = authenticated,
                CreateDate     = createDate,
                ExpirationDate = expirationDate,
                Message        = message
            };

            return(response);
        }
예제 #6
0
        public async Task ExecuteAsync(IdentityServerContext context)
        {
            var dto = new TokenResponseDto
            {
                id_token = TokenResponse.IdentityToken,
                access_token = TokenResponse.AccessToken,
                refresh_token = TokenResponse.RefreshToken,
                expires_in = TokenResponse.AccessTokenLifetime,
                token_type = Constants.TokenTypes.Bearer
            };

            context.HttpContext.Response.SetNoCache();
            await context.HttpContext.Response.WriteJsonAsync(dto);
        }
예제 #7
0
        public async Task ExecuteAsync(IdentityServerContext context)
        {
            var dto = new TokenResponseDto
            {
                id_token      = TokenResponse.IdentityToken,
                access_token  = TokenResponse.AccessToken,
                refresh_token = TokenResponse.RefreshToken,
                expires_in    = TokenResponse.AccessTokenLifetime,
                token_type    = Constants.TokenTypes.Bearer
            };

            context.HttpContext.Response.SetNoCache();
            await context.HttpContext.Response.WriteJsonAsync(dto);
        }
        public static TokenResponseDto ConvertToTokenResponseDto(UserBo bo)
        {
            TokenResponseDto tokenUserDto = new TokenResponseDto();

            tokenUserDto.Id             = bo.Id;
            tokenUserDto.FirstName      = bo.FirstName;
            tokenUserDto.MiddleName     = bo.MiddleName;
            tokenUserDto.LastName       = bo.LastName;
            tokenUserDto.EmailAddress   = bo.EmailAddress;
            tokenUserDto.OrganizationId = bo.OrganizationId;
            tokenUserDto.LastLoginTime  = bo.LastLoginTime;
            tokenUserDto.UserTypeId     = bo.UserTypeId;

            return(tokenUserDto);
        }
        private async Task <ServiceResult <TokenResponseDto> > GetTokenResponseAsync(UserBo user)
        {
            string accessToken  = "";
            string refreshToken = GenerateRefreshToken();
            ServiceResult <TokenResponseDto> response = null;

            UserTokenBo userTokenBo = GenerateUserToken(user);

            userTokenBo.RefreshToken = refreshToken;
            userTokenBo.AccessToken  = "";

            ServiceResult <UserTokenBo> userTokenResult = await serviceManager.UserToken_Service.CreateAsync(userTokenBo);

            if (!userTokenResult.Success)
            {
                response = new ServiceResult <TokenResponseDto>(null, false, "User Token Create Failed!");
                return(response);
            }
            userTokenBo = userTokenResult.Data;

            try
            {
                //sign your token here here..
                accessToken = GenerateAccessToken(userTokenBo.Id, user);
            }
            catch (Exception ex)
            {
                response = new ServiceResult <TokenResponseDto>(null, false, "Token Create Failed! " + (ex.Message));
                return(response);
            }
            userTokenBo.AccessToken = accessToken;
            await serviceManager.UserToken_Service.UpdateAsync(userTokenBo.Id, userTokenBo);

            await serviceManager.UserLogin_Service.CreateAsync(new UserLoginBo()
            {
                UserId = user.Id, LoginTime = DateTime.UtcNow
            });

            TokenResponseDto tokenResponseDto = UserBo.ConvertToTokenResponseDto(user);

            tokenResponseDto.AccessToken  = accessToken;
            tokenResponseDto.RefreshToken = refreshToken;

            response = new ServiceResult <TokenResponseDto>(tokenResponseDto, true, "");
            return(response);
        }
        public async Task <IActionResult> Register([FromBody] RegisterUserDto model)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            var user = new UserModel
            {
                UserName    = model.Email,
                Email       = model.Email,
                Name        = model.Name,
                PhoneNumber = model.PhoneNumber,
                Experience  = model.Experience,
                LinkedInUrl = model.LinkedinUrl,
                IsBlocked   = false
            };

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

            if (result.Succeeded)
            {
                // role name
                var roleName = roleManager.Roles.
                               FirstOrDefault(r => r.Id == model.Role.ToString()).NormalizedName;
                var res = await userManager.AddToRoleAsync(user, roleName);

                if (res.Succeeded)
                {
                    //sending response if succeeded
                    var appUser = userManager.Users.Single(r => r.Email == model.Email);
                    var token   = await GenerateJwtToken(model.Email, appUser);

                    var response = new TokenResponseDto
                    {
                        Token = token,
                        Email = model.Email,
                        Role  = model.Role
                    };
                    return(Ok(response));
                }
                return(BadRequest(res.Errors));
            }
            return(BadRequest(result.Errors));
        }
예제 #11
0
        private HttpResponseMessage Execute()
        {
            var dto = new TokenResponseDto
            {
                id_token      = _response.IdentityToken,
                access_token  = _response.AccessToken,
                refresh_token = _response.RefreshToken,
                expires_in    = _response.AccessTokenLifetime,
                token_type    = _response.TokenType,
                alg           = _response.Algorithm
            };

            var jobject = JObject.FromObject(dto, Serializer);

            // custom entries
            if (_response.Custom != null && _response.Custom.Any())
            {
                foreach (var item in _response.Custom)
                {
                    JToken token;
                    if (jobject.TryGetValue(item.Key, out token))
                    {
                        throw new Exception("Item does already exist - cannot add it via a custom entry: " + item.Key);
                    }

                    if (item.Value.GetType().IsClass)
                    {
                        jobject.Add(new JProperty(item.Key, JToken.FromObject(item.Value)));
                    }
                    else
                    {
                        jobject.Add(new JProperty(item.Key, item.Value));
                    }
                }
            }

            var response = new HttpResponseMessage(HttpStatusCode.OK)
            {
                Content = new StringContent(jobject.ToString(Formatting.None), Encoding.UTF8, "application/json")
            };

            Logger.Info("Returning token response.");
            return(response);
        }
예제 #12
0
        private HttpResponseMessage Execute()
        {
            var dto = new TokenResponseDto
            {
                id_token = _response.IdentityToken,
                access_token = _response.AccessToken,
                refresh_token = _response.RefreshToken,
                expires_in = _response.AccessTokenLifetime,
                token_type = _response.TokenType,
                alg = _response.Algorithm
            };

            var jobject = JObject.FromObject(dto, Serializer);

            // custom entries
            if (_response.Custom != null && _response.Custom.Any())
            {
                foreach (var item in _response.Custom)
                {
                    JToken token;
                    if (jobject.TryGetValue(item.Key, out token))
                    {
                        throw new Exception("Item does already exist - cannot add it via a custom entry: " + item.Key);
                    }

                    if (item.Value.GetType().IsClass)
                    {
                        jobject.Add(new JProperty(item.Key, JToken.FromObject(item.Value)));
                    }
                    else
                    {
                        jobject.Add(new JProperty(item.Key, item.Value));
                    }
                }
            }

            var response = new HttpResponseMessage(HttpStatusCode.OK)
            {
                Content = new StringContent(jobject.ToString(Formatting.None), Encoding.UTF8, "application/json")
            };

            Logger.Info("Returning token response.");
            return response;
        }
        public async Task <IActionResult> Post([FromBody] AuthenticationDto dto)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest());
            }

            var responseDto = await Envelope(async() =>
            {
                var result   = await _identityService.Authenticate(dto.Username, dto.Password);
                var response = TokenResponseDto.Create(result, dto.Username);

                if (result == AuthenticateResult.Ok)
                {
                    var identity = await _identityRepository.GetByEmail(dto.Username);
                    var claims   = new[]
                    {
                        new Claim(JwtRegisteredClaimNames.Sub, identity.Id.ToString()),
                        new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
                        new Claim(ClaimTypes.Email, identity.Email),
                        new Claim(ClaimTypes.Name, identity.Username),
                        new Claim(ClaimTypes.Actor, identity.IdType.ToString()),
                        new Claim(ClaimTypes.Role, IdentityRoles.ToRole(identity.IdType))
                    };

                    var token = new JwtSecurityToken(
                        _configurationProvider.TokenConfiguration.Issuer,
                        _configurationProvider.TokenConfiguration.Audience,
                        claims,
                        expires: DateTime.UtcNow.AddHours(1),
                        signingCredentials: new SigningCredentials(
                            _configurationProvider.TokenConfiguration.SigningKey,
                            SecurityAlgorithms.HmacSha256));

                    response.Token = new JwtSecurityTokenHandler().WriteToken(token);
                }

                return(response);
            });

            responseDto.IsSuccessful = responseDto.Payload.Token.HasValue();
            return(Ok(responseDto));
        }
예제 #14
0
        private HttpResponseMessage Execute()
        {
            var dto = new TokenResponseDto
            {
                id_token      = _response.IdentityToken,
                access_token  = _response.AccessToken,
                refresh_token = _response.RefreshToken,
                expires_in    = _response.AccessTokenLifetime,
                token_type    = Constants.TokenTypes.Bearer
            };

            var response = new HttpResponseMessage(HttpStatusCode.OK)
            {
                Content = new ObjectContent <TokenResponseDto>(dto, Formatter)
            };

            Logger.Info("Returning token response.");
            return(response);
        }
예제 #15
0
        private HttpResponseMessage Execute()
        {
            var dto = new TokenResponseDto
            {
                id_token = _response.IdentityToken,
                access_token = _response.AccessToken,
                refresh_token = _response.RefreshToken,
                expires_in = _response.AccessTokenLifetime,
                token_type = Constants.TokenTypes.Bearer
            };

            var response = new HttpResponseMessage(HttpStatusCode.OK)
            {
                Content = new ObjectContent<TokenResponseDto>(dto, Formatter)
            };

            Logger.Info("Returning token response.");
            return response;
        }
        private HttpResponseMessage Execute()
        {
            var dto = new TokenResponseDto
            {
                id_token = _response.IdentityToken,
                access_token = _response.AccessToken,
                expires_in = _response.AccessTokenLifetime,
                token_type = Constants.TokenTypes.Bearer
            };

            var formatter = new JsonMediaTypeFormatter();
            formatter.SerializerSettings.DefaultValueHandling = DefaultValueHandling.Ignore;

            var response = new HttpResponseMessage(HttpStatusCode.OK)
            {
                Content = new ObjectContent<TokenResponseDto>(dto, formatter)
            };

            return response;
        }
예제 #17
0
        private HttpResponseMessage Execute()
        {
            var dto = new TokenResponseDto
            {
                id_token     = _response.IdentityToken,
                access_token = _response.AccessToken,
                expires_in   = _response.AccessTokenLifetime,
                token_type   = Constants.TokenTypes.Bearer
            };

            var formatter = new JsonMediaTypeFormatter();

            formatter.SerializerSettings.DefaultValueHandling = DefaultValueHandling.Ignore;

            var response = new HttpResponseMessage(HttpStatusCode.OK)
            {
                Content = new ObjectContent <TokenResponseDto>(dto, formatter)
            };

            return(response);
        }
예제 #18
0
        private TokenResponseDto CreateTokenResponse(JwtSecurityToken token, User user)
        {
            if (user == null || token == null)
            {
                return(null);
            }
            var tokenResponse = new TokenResponseDto
            {
                IsAccountActive = user.EmailConfirmed,
                Token           = !user.EmailConfirmed
                    ? null
                    : new TokenDto
                {
                    Token        = new JwtSecurityTokenHandler().WriteToken(token),
                    BoardsExists = user.Boards != null && user.Boards.Any(x => !x.IsDeleted &&
                                                                          !x.Board.IsDeleted &&
                                                                          x.LastTimeVisited > DateTime.MinValue)
                }
            };

            return(tokenResponse);
        }
예제 #19
0
        private HttpResponseMessage Execute()
        {
            var dto = new TokenResponseDto
            {
                id_token = _response.IdentityToken,
                access_token = _response.AccessToken,
                refresh_token = _response.RefreshToken,
                expires_in = _response.AccessTokenLifetime,
                token_type = Constants.TokenTypes.Bearer
            };

            var jobject = JObject.FromObject(dto, Serializer);

            // custom entries
            if (_response.Custom != null && _response.Custom.Any())
            {
                foreach (var item in _response.Custom)
                {
                    JToken token;
                    if (jobject.TryGetValue(item.Key, out token))
                    {
                        throw new Exception("Item does already exist - cannot add it via a custom entry: " + item.Key);
                    }

                    jobject.Add(new JProperty(item.Key, item.Value));
                }
            }

            var response = new HttpResponseMessage(HttpStatusCode.OK)
            {
                //Content = new ObjectContent<JObject>(jobject, new JsonMediaTypeFormatter())
                Content = new StringContent(jobject.ToString(), Encoding.UTF8, "application/json")
            };

            Logger.Info("Returning token response.");
            return response;
        }
예제 #20
0
        private HttpResponseMessage Execute()
        {
            var dto = new TokenResponseDto
            {
                id_token      = _response.IdentityToken,
                access_token  = _response.AccessToken,
                refresh_token = _response.RefreshToken,
                expires_in    = _response.AccessTokenLifetime,
                token_type    = Constants.TokenTypes.Bearer
            };

            var jobject = JObject.FromObject(dto, Serializer);

            // custom entries
            if (_response.Custom != null && _response.Custom.Any())
            {
                foreach (var item in _response.Custom)
                {
                    JToken token;
                    if (jobject.TryGetValue(item.Key, out token))
                    {
                        throw new Exception("Item does already exist - cannot add it via a custom entry: " + item.Key);
                    }

                    jobject.Add(new JProperty(item.Key, item.Value));
                }
            }

            var response = new HttpResponseMessage(HttpStatusCode.OK)
            {
                //Content = new ObjectContent<JObject>(jobject, new JsonMediaTypeFormatter())
                Content = new StringContent(jobject.ToString(), Encoding.UTF8, "application/json")
            };

            Logger.Info("Returning token response.");
            return(response);
        }
예제 #21
0
        private async Task <TokenResponseDto> GenerateToken(string username)
        {
            var user = await _userManager.FindByNameAsync(username);

            var roles = from ur in _context.UserRoles
                        join r in _context.Roles on ur.RoleId equals r.Id
                        where ur.UserId == user.Id
                        select new { ur.UserId, ur.RoleId, r.Name };

            var claims = new List <Claim>
            {
                new Claim(ClaimTypes.Name, username),
                new Claim(ClaimTypes.NameIdentifier, user.Id),
                new Claim(JwtRegisteredClaimNames.Nbf, new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds().ToString()),
                new Claim(JwtRegisteredClaimNames.Exp, new DateTimeOffset(DateTime.Now.AddMinutes(_tokenLifetime)).ToUnixTimeSeconds().ToString())
            };

            foreach (var role in roles)
            {
                claims.Add(new Claim(ClaimTypes.Role, role.Name));
            }

            var token = new JwtSecurityToken(
                new JwtHeader(
                    new SigningCredentials(
                        new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_securityKey)),
                        SecurityAlgorithms.HmacSha256)),
                new JwtPayload(claims));

            var output = new TokenResponseDto()
            {
                AccessToken = new JwtSecurityTokenHandler().WriteToken(token),
                UserName    = username
            };

            return(output);
        }
        private async Task <TokenResponseDto> RefreshTokenAsync(TokenResponseDto dto)
        {
            var policy = GetRetryPolicy();

            return(await policy.ExecuteAsync(async() =>
            {
                var client = new RestClient("https://api.netatmo.com");
                var request = new RestRequest("/oauth2/token");
                request.AddHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
                request.AddParameter("grant_type", dto.RefreshToken);
                request.AddParameter("client_id", _clientId);
                request.AddParameter("client_secret", _clientSecret);

                var token = await client.PostTaskAsync <TokenResponseDto>(request);

                if (token?.AccessToken == null)
                {
                    return null;
                }

                token.Expiration = DateTime.UtcNow.AddSeconds(token.ExpiresIn);
                return token;
            }));
        }
        private async Task<TokenResponseDto> RefreshTokenAsync(TokenResponseDto dto)
        {
            var policy = GetRetryPolicy();

            return await policy.ExecuteAsync(async () =>
            {
                var client = new RestClient("https://api.netatmo.com");
                var request = new RestRequest("/oauth2/token");
                request.AddHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
                request.AddParameter("grant_type", dto.RefreshToken);
                request.AddParameter("client_id", _clientId);
                request.AddParameter("client_secret", _clientSecret);

                var token = await client.PostTaskAsync<TokenResponseDto>(request);

                if (token?.AccessToken == null)
                {
                    return null;
                }

                token.Expiration = DateTime.UtcNow.AddSeconds(token.ExpiresIn);
                return token;
            });
        }
        private async Task GetDeviceData(TokenResponseDto token)
        {
            var client = new RestClient("https://api.netatmo.com");
            var request = new RestRequest("/api/getstationsdata");
            request.AddQueryParameter("access_token", token.AccessToken);

            var data = await client.GetTaskAsync<StationDataResponseDto>(request);

            if (data?.Body?.Devices == null)
            {
                return;
            }

            lock (_deviceLock)
            {
                foreach (var dataDevice in data.Body.Devices)
                {
                    var station = dataDevice.StationName;
                    dataDevice.BatteryPercent = 100;

                    UpdateDevice(station, dataDevice);

                    if (dataDevice.Modules == null)
                    {
                        continue;
                    }

                    foreach (var module in dataDevice.Modules)
                    {
                        UpdateDevice(station, module);
                    }
                }
            }
        }
예제 #25
0
        private async Task <IActionResult> GetToken(TokenRequestDto tokenRequestDto)
        {
            try {
                // Check if there's an user with the given email
                var user = await UserManager.FindByEmailAsync(tokenRequestDto.Email);

                // or username
                if (user == null)
                {
                    user = await UserManager.FindByNameAsync(tokenRequestDto.Email);
                }

                if (user == null ||
                    !await UserManager.CheckPasswordAsync(user, tokenRequestDto.Password))
                {
                    // User doesn't exists or password mismatch.
                    return(new UnauthorizedResult());
                }

                // Email and password matches. Create and return the JWT token.
                DateTime now = DateTime.UtcNow;

                // Add the registered claims for JWT.
                var claims = new List <Claim> {
                    new Claim(JwtRegisteredClaimNames.Sub, user.Id),
                    new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
                    new Claim(JwtRegisteredClaimNames.Iat, new DateTimeOffset(now).ToUnixTimeSeconds().ToString()),
                    new Claim("Username", user.UserName)
                    // TODO:
                    // Add additional claims here.
                };

                // Get user claims from database.
                var claimsFromDb = new List <Claim>(await UserManager.GetClaimsAsync(user));
                claims.AddRange(claimsFromDb);

                var tokenExpirationMins = Configuration.GetValue <int>("Auth:Jwt:TokenExpirationInMinutes");
                var issuerSigningKey    = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Auth:Jwt:Key"]));

                var token = new JwtSecurityToken(
                    issuer: Configuration["Auth:Jwt:Issuer"],
                    audience: Configuration["Auth:Jwt:Audience"],
                    claims: claims,
                    notBefore: now,
                    expires: now.Add(TimeSpan.FromMinutes(tokenExpirationMins)),
                    signingCredentials: new SigningCredentials(issuerSigningKey, SecurityAlgorithms.HmacSha256)
                    );
                var encodedToken = new JwtSecurityTokenHandler().WriteToken(token);

                // Build and return the response.
                var response = new TokenResponseDto()
                {
                    Token      = encodedToken,
                    Expiration = tokenExpirationMins
                };

                return(Ok(response));
            }
            catch {
                return(new UnauthorizedResult());
            }
        }