示例#1
0
        public async Task <ActionResult> RefreshAsync(RefreshRequest refreshRequest, ModelStateDictionary modelState)
        {
            if (!modelState.IsValid)
            {
                return(BadRequestModelState(modelState));
            }

            bool isValidRefreshToken = _refreshTokenValidator.Validate(refreshRequest.RefreshToken);

            if (!isValidRefreshToken)
            {
                return(new BadRequestObjectResult(new ErrorResponse("Invalid refresh token.")));
            }

            RefreshToken refreshTokenDTO = await _refreshTokenRepository.GetByTokenAsync(refreshRequest.RefreshToken);

            if (refreshTokenDTO == null)
            {
                return(new NotFoundObjectResult(new ErrorResponse("Invalid refresh token.")));
            }

            await _refreshTokenRepository.DeleteAsync(refreshTokenDTO.Id);

            Account account = await _accountService.GetAsync(refreshTokenDTO.AccountId);

            if (account == null)
            {
                return(new NotFoundObjectResult(new ErrorResponse("Account not found.")));
            }

            AuthenticatedAccountResponse response = await _authenticator.AuthenticateAsync(account);

            return(new OkObjectResult(response));
        }
        public async System.Threading.Tasks.Task Login(string username, string password)
        {
            Tokens = await _authenticationClient.LoginAsync(username, password);

            _tokenProvider.WriteTokensToFile(Tokens);
            CurrentAccount = await _accountClient.GetAccountAsync(Tokens.AccessToken);
        }
示例#3
0
 public void WriteTokensToFile(AuthenticatedAccountResponse tokens)
 {
     using (StreamWriter file = File.CreateText(Path)) {
         JsonSerializer serializer = new JsonSerializer();
         //serialize object directly into file stream
         serializer.Serialize(file, tokens);
     }
 }
        public async System.Threading.Tasks.Task LogoutAsync()
        {
            bool result = await _authenticationClient.LogoutAsync(Tokens.AccessToken);

            if (!result)
            {
                Tokens = await _authenticationClient.RefreshAsync(Tokens.RefreshToken);

                result = await _authenticationClient.LogoutAsync(Tokens.AccessToken);
            }
            _tokenProvider.DeleteFile();
            CurrentAccount = null;
        }
        public async Task <RegistrationResponse> RegisterAsync(string email, string username, string password, string confirmPassword)
        {
            RegisterRequest registerRequest = new RegisterRequest()
            {
                Email           = email,
                Username        = username,
                Password        = password,
                ConfirmPassword = confirmPassword
            };

            string json = JsonConvert.SerializeObject(registerRequest);

            var data = new StringContent(json, Encoding.UTF8, "application/json");

            HttpResponseMessage response = await _client.PostAsync("register", data);

            RegistrationResponse registrationResponse = new RegistrationResponse();
            string jsonResponse = await response.Content.ReadAsStringAsync();

            if (response.StatusCode == System.Net.HttpStatusCode.BadRequest)
            {
                registrationResponse.registrationResult           = RegistrationResult.InvalidEmail;
                registrationResponse.authenticatedAccountResponse = null;
                return(registrationResponse);
            }

            if (response.StatusCode == System.Net.HttpStatusCode.Conflict)
            {
                ErrorResponse errorResponse = JsonConvert.DeserializeObject <ErrorResponse>(jsonResponse);
                string        errorMessage  = errorResponse.ErrorMessages.First();
                if (errorMessage == "Account with this email already exists.")
                {
                    registrationResponse.registrationResult = RegistrationResult.EmailAlreadyExists;
                }
                if (errorMessage == "Account with this username already exists.")
                {
                    registrationResponse.registrationResult = RegistrationResult.UsernameAlreadyExists;
                }
                registrationResponse.authenticatedAccountResponse = null;
                return(registrationResponse);
            }

            AuthenticatedAccountResponse authenticatedAccountResponse = JsonConvert.DeserializeObject <AuthenticatedAccountResponse>(jsonResponse);

            registrationResponse.authenticatedAccountResponse = authenticatedAccountResponse;
            registrationResponse.registrationResult           = RegistrationResult.Success;
            return(registrationResponse);
        }
示例#6
0
        public async Task <ActionResult> RegisterAsync(RegistrationRequest registrationRequest, ModelStateDictionary modelState)
        {
            if (!modelState.IsValid)
            {
                return(BadRequestModelState(modelState));
            }

            if (registrationRequest.Password != registrationRequest.ConfirmPassword)
            {
                return(new BadRequestObjectResult(new ErrorResponse("Passwords don't match.")));
            }

            Account existingAccountByEmail = await _accountService.GetByEmailAsync(registrationRequest.Email);

            if (existingAccountByEmail != null)
            {
                return(new ConflictObjectResult(new ErrorResponse("Account with this email already exists.")));
            }

            Account existingAccountByUsername = await _accountService.GetByUsernameAsync(registrationRequest.Username);

            if (existingAccountByUsername != null)
            {
                return(new ConflictObjectResult(new ErrorResponse("Account with this username already exists.")));
            }

            string  passwordHash        = _passwordHasher.HashPassword(registrationRequest.Password);
            Account registrationAccount = new Account()
            {
                Email        = registrationRequest.Email,
                Username     = registrationRequest.Username,
                PasswordHash = passwordHash,
                DatesJoined  = DateTime.Today
            };

            Account account = await _accountService.CreateAsync(registrationAccount);

            AuthenticatedAccountResponse response = await _authenticator.AuthenticateAsync(account);

            return(new OkObjectResult(response));
        }
        public async Task <bool> RefreshAccessToken()
        {
            Tokens = await _authenticationClient.RefreshAsync(Tokens.RefreshToken);

            if (Tokens == null)
            {
                return(false);
            }
            else
            {
                CurrentAccount = await _accountClient.GetAccountAsync(Tokens.AccessToken);

                if (CurrentAccount == null)
                {
                    return(false);
                }
                else
                {
                    _tokenProvider.WriteTokensToFile(Tokens);
                    return(true);
                }
            }
        }
        public async Task <bool> TryToAuthenticateAsync()
        {
            Tokens = _tokenProvider.GetTokensFromFile();
            if (Tokens == null)
            {
                return(false);
            }
            else
            {
                try {
                    CurrentAccount = await _accountClient.GetAccountAsync(Tokens.AccessToken);

                    if (CurrentAccount == null)
                    {
                        return(false);
                    }
                }
                catch (UnauthorizedException) {
                    return(await RefreshAccessToken());
                }
                return(true);
            }
        }
示例#9
0
        public async Task <ActionResult> LoginAsync(LoginRequest loginRequest, ModelStateDictionary modelState)
        {
            if (!modelState.IsValid)
            {
                return(BadRequestModelState(modelState));
            }

            Account account = await _accountService.GetByUsernameAsync(loginRequest.Username);

            if (account == null)
            {
                return(new UnauthorizedObjectResult("User with this username wasn't found."));
            }

            PasswordVerificationResult passwordResult = _passwordHasher.VerifyHashedPassword(account.PasswordHash, loginRequest.Password);

            if (passwordResult != PasswordVerificationResult.Success)
            {
                return(new UnauthorizedObjectResult("Password is invalid."));
            }
            AuthenticatedAccountResponse response = await _authenticator.AuthenticateAsync(account);

            return(new OkObjectResult(response));
        }