コード例 #1
0
        public Task <ICommandResult> Handle(TokenUserCommand command,
                                            CancellationToken cancellationToken)
        {
            var user = _userManager.FindByNameAsync(command.Email).Result;

            if (user == null)
            {
                return(CanceledTask(_bus.RaiseEvent(new DomainNotification(command.MessageType,
                                                                           "O usuário informado não está cadastrado."))));
            }

            if (user.UserStatus.Equals(EUserStatus.Pending))
            {
                return(CanceledTask(_bus.RaiseEvent(new DomainNotification(command.MessageType,
                                                                           "A conta encontra-se pendente, aguarde a ativação da sua conta!"))));
            }

            var resultSignIn = _signInManager
                               .CheckPasswordSignInAsync(user, command.Password, false)
                               .Result.Succeeded;

            if (!resultSignIn)
            {
                return(CanceledTask(_bus.RaiseEvent(new DomainNotification(command.MessageType,
                                                                           "Senha inválida."))));
            }

            var roles = _userManager.GetRolesAsync(user).Result;

            return(CompletedTask((_tokenService.CreateToken(GenericUserId(user),
                                                            user,
                                                            roles,
                                                            UserName(user)))));
        }
        public async Task <IActionResult> Token([FromBody] TokenUserCommand tokenUserCommand)
        {
            var email    = tokenUserCommand.Email;
            var password = tokenUserCommand.Password;

            try
            {
                // Check the password but don't "sign in" (which would set a cookie)
                var user = await _signInManager.UserManager.FindByEmailAsync(email);

                if (user == null)
                {
                    return(Ok("Login failed"));
                }

                var result = await _signInManager.CheckPasswordSignInAsync(user, password, lockoutOnFailure : false);

                if (result.Succeeded)
                {
                    var principal = await _signInManager.CreateUserPrincipalAsync(user);

                    var token = new JwtSecurityToken(
                        "SignalRAuthenticationSample",
                        "SignalRAuthenticationSample",
                        principal.Claims,
                        expires: DateTime.UtcNow.AddDays(30),
                        signingCredentials: SigningCreds);

                    var writtenToken = _tokenHandler.WriteToken(token);

                    if (HttpContext.Request.Cookies["Token"] == null || HttpContext.Request.Cookies["UserName"] != email)
                    {
                        var cookieOptions = new CookieOptions();
                        cookieOptions.Expires = DateTime.Now.AddDays(30);
                        HttpContext.Response.Cookies.Append("Token", writtenToken, cookieOptions);
                        HttpContext.Response.Cookies.Append("UserName", email, cookieOptions);
                    }

                    return(Ok(writtenToken));
                }
                else
                {
                    var error = result.IsLockedOut ? "User is locked out" : "Login failed";
                    return(Ok(error));
                }
            }
            catch (Exception ex)
            {
                var error = ex.ToString();
                return(Ok(error));
            }
        }
        private async void ConnectButton_Click(object sender, RoutedEventArgs e)
        {
            connectButton.IsEnabled = false;
            var email    = emailTextBox.Text;
            var password = passwordBox.Password;

            if (string.IsNullOrWhiteSpace(email) || string.IsNullOrWhiteSpace(password))
            {
                messagesList.Items.Add("Email or Password are blank.");
                return;
            }

            _connection = new HubConnectionBuilder()
                          .WithUrl($"{_settings.BaseAddress}ChatHub?ClientType=PC", options =>
            {
                options.AccessTokenProvider = async() =>
                {
                    var tokenUserCommand = new TokenUserCommand
                    {
                        Email    = emailTextBox.Text,
                        Password = passwordBox.Password
                    };

                    var token = await RestService.PostAsync <string>("account/token", tokenUserCommand);
                    return(token);
                };
            })
                          .Build();

            _connection.Closed += async(error) =>
            {
                await Task.Delay(new Random().Next(0, 5) * 1000);

                await _connection.StartAsync();
            };

            _ = _connection.On <string>("ReceiveChatMessage", (userAndMessage) =>
            {
                Dispatcher.Invoke(() =>
                {
                    var newMessage = userAndMessage;
                    messagesList.Items.Add(newMessage);
                });
            });

            _connection.On <string>("SendLargeDataAsync", (user) =>
            {
                _ = Dispatcher.Invoke(async() =>
                {
                    try
                    {
                        // Get large json from https://next.json-generator.com
                        var currentDirectory = Directory.GetCurrentDirectory();
                        //var jsonData = await File.ReadAllTextAsync(currentDirectory + "\\..\\..\\..\\test25.json");
                        var jsonData      = await File.ReadAllTextAsync(currentDirectory + "\\..\\..\\..\\test100.json");
                        var numberOfBytes = Encoding.Default.GetByteCount(jsonData);
                        var newMessage    = $"Sending large data to User:{user}, Bytes: {numberOfBytes}";
                        messagesList.Items.Add(newMessage);

                        var submitLargeDataCommand = new SubmitLargeDataCommand
                        {
                            User     = user,
                            JsonData = jsonData
                        };

                        await RestService.PostAsync("LargeData/SubmitLargeData", submitLargeDataCommand);
                    }
                    catch (Exception ex)
                    {
                        var message = ex.Message;
                        throw;
                    }
                });
            });

            try
            {
                await _connection.StartAsync();

                messagesList.Items.Add("Connection started");
                sendButton.IsEnabled = true;
            }
            catch (Exception ex)
            {
                messagesList.Items.Add(ex.Message);
                connectButton.IsEnabled = true;
            }
        }
コード例 #4
0
 public IActionResult Token([FromBody] TokenUserCommand command)
 => Response(bus.SendCommand(command).Result);