public async Task SuccessfulAuthentication_ReturnsCorrectAuthHeaders_AndRedirectsTo_GetRemindersView()
        {
            var fakeAccessToken  = "fakeAccessToken";
            var fakeIdToken      = "fakeIdToken";
            var fakeRefreshToken = "fakeRefreshToken";

            var user = new AwsCognitoUser
            {
                UserName = "******",
                Password = "******"
            };

            var mockAuthResult = new AuthenticationResultType
            {
                AccessToken  = fakeAccessToken,
                IdToken      = fakeIdToken,
                RefreshToken = fakeRefreshToken
            };

            _authAdapter.AuthenticateUserAsync(Arg.Any <AwsCognitoUser>()).Returns(new HttpResponseMessage
            {
                StatusCode = HttpStatusCode.OK,
                Content    = new StringContent(JsonConvert.SerializeObject(mockAuthResult))
            });

            var context      = _accountsController.ControllerContext.HttpContext = new DefaultHttpContext();
            var authResponse = await _accountsController.Login(user) as RedirectToActionResult;

            Assert.AreEqual("GetRemindersView", authResponse.ActionName);
        }
        public async Task SuccessfulAuthenticationRequest_ReturnsAuthenticationResult_AndStatusCodeOk()
        {
            var fakeAccessToken  = "fakeAccessToken";
            var fakeIdToken      = "fakeIdToken";
            var fakeRefreshToken = "fakeRefreshToken";

            var user = new AwsCognitoUser
            {
                UserName = "******",
                Password = "******"
            };

            _cognitoAdapterHelper.UserExists(Arg.Any <AwsCognitoUser>()).Returns(true);
            _cognitoAdapterHelper.UserIsConfirmed(Arg.Any <AwsCognitoUser>()).Returns(true);
            _awsCognitoClient.InitiateAuthAsync(Arg.Any <InitiateAuthRequest>()).Returns(new InitiateAuthResponse
            {
                AuthenticationResult = new AuthenticationResultType
                {
                    AccessToken  = fakeAccessToken,
                    IdToken      = fakeIdToken,
                    RefreshToken = fakeRefreshToken
                }
            });

            var authResponse = await _authAdapter.AuthenticateUserAsync(user);

            var content = await authResponse.Content.ReadAsStringAsync();

            var authenticationResult = JsonConvert.DeserializeObject <AuthenticationResultType>(content);

            Assert.AreEqual(HttpStatusCode.OK, authResponse.StatusCode);
            Assert.AreEqual(fakeAccessToken, authenticationResult.AccessToken);
            Assert.AreEqual(fakeIdToken, authenticationResult.IdToken);
            Assert.AreEqual(fakeRefreshToken, authenticationResult.RefreshToken);
        }
        public async Task <IActionResult> Login([FromBody] AwsCognitoUser cognitoUser)
        {
            try
            {
                var loginResponse = await _authAdapter.AuthenticateUserAsync(cognitoUser);

                switch (loginResponse.StatusCode)
                {
                case HttpStatusCode.OK:
                    var authResult =
                        JsonConvert.DeserializeObject <AuthenticationResultType>(
                            await loginResponse.Content.ReadAsStringAsync());
                    var tokenResponse = new TokenResponse
                    {
                        IdToken      = authResult.IdToken,
                        RefreshToken = authResult.RefreshToken,
                        AccessToken  = authResult.AccessToken
                    };
                    return(new ContentResult
                    {
                        Content = JsonConvert.SerializeObject(tokenResponse),
                        ContentType = "application/json",
                        StatusCode = (int)HttpStatusCode.OK
                    });

                case HttpStatusCode.BadRequest:
                    return(new BadRequestObjectResult($"Login failed. User {cognitoUser.UserName} is unconfirmed."));

                case HttpStatusCode.NotFound:
                    return(new NotFoundObjectResult($"Login failed. User {cognitoUser.UserName} does not exist."));

                default:
                    return(new ContentResult
                    {
                        ContentType = "text/plain",
                        Content = "An error has occurred",
                        StatusCode = (int)loginResponse.StatusCode
                    });
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }
        }
Exemple #4
0
        public async Task <IActionResult> Login(AwsCognitoUser cognitoUser, string message = "")
        {
            ViewBag.InfoMessage = message;
            HttpResponseMessage loginResponse;

            try
            {
                loginResponse = await _authAdapter.AuthenticateUserAsync(cognitoUser);

                if (loginResponse.IsSuccessStatusCode)
                {
                    await _userRepository.UpdateMostRecentLoginTimeAsync(cognitoUser.UserName);

                    var authResult = JsonConvert.DeserializeObject <AuthenticationResultType>(await loginResponse.Content.ReadAsStringAsync());
                    HttpContext.Response.Cookies.Append(
                        "IdToken",
                        authResult.IdToken,
                        new CookieOptions
                    {
                        HttpOnly = true
                    }
                        );

                    HttpContext.Response.Cookies.Append(
                        "RefreshToken",
                        authResult.RefreshToken,
                        new CookieOptions
                    {
                        HttpOnly = true
                    }
                        );

                    HttpContext.Response.Cookies.Append(
                        "AccessToken",
                        authResult.AccessToken,
                        new CookieOptions
                    {
                        HttpOnly = true
                    }
                        );
                }
            }
            catch (Exception ex)
            {
                _logger.LogError(ex);
                return(RedirectToAction("GetLoginView", "Accounts", new { message = "An error has occurred." }));
            }

            switch (loginResponse.StatusCode)
            {
            case HttpStatusCode.OK:
                return(RedirectToAction("GetRemindersView", "Reminders"));

            case HttpStatusCode.BadRequest:
                return(RedirectToAction("GetConfirmAccountView", "Accounts", new { message = $"Login failed. User {cognitoUser.UserName} is unconfirmed. Please confirm account to continue." }));

            case HttpStatusCode.NotFound:
                return(RedirectToAction("GetCreateAccountView", "Accounts", new { message = $"Login failed. User {cognitoUser.UserName} does not exist. Please create an account to continue." }));

            default:
                _logger.LogError(loginResponse);
                return(RedirectToAction("GetLoginView", "Accounts", new { message = "An error has occurred." }));
            }
        }