C # Проверка пользователя все еще вошли в систему с каждым действием (получение информации из API) - PullRequest
0 голосов
/ 05 мая 2018

У меня есть приложение WPF (написанное на C # с использованием MVVM), где я начинаю с окна входа в систему, где пользователи входят в систему. Когда имя пользователя и пароль заполнены, я делаю веб-запрос (POST) на нашу страницу входа (на нашем совместном веб-сайте), где я отправляю данные, получаю веб-ответ, и когда код состояния ответа в порядке, и я получаю cookie, я знаю, что я Я вошел в систему успешно. Далее в своем приложении я использую тот же cookie для вызова нашей веб-страницы API (также через веб-запросы), чтобы получить все данные для приложения.

Срок действия файла cookie истекает (через 6 часов после создания). Когда я делаю новый веб-запрос и срок действия файла cookie истек, мне нужно снова показать страницу входа. После входа приложение должно возобновить работу с того места, где оно остановилось.

Я знаю, что мне нужно изменить свое приложение, чтобы оно начиналось не со страницы входа в систему, а с главной страницы и проверки наличия файла cookie (и срок его действия не истек). При запуске файл cookie не установлен, поэтому он покажет страницу входа.

Но как мне сохранить приложение, когда срок действия файла cookie истек (и я делаю новый веб-запрос), показать ту же страницу входа и обработать логин (перезаписать файл cookie) и возобновить работу с того места, где я остановился (повторно выполнить веб-запрос)? И как я могу уведомить главную страницу с другой страницы, которую должна показать страница входа в систему?

1 Ответ

0 голосов
/ 05 мая 2018

WPF не является веб-приложением. У вас есть состояние в настольном приложении, если вы не выбрасываете его каким-либо образом.
Страницы - анахронизм в терминах wpf.
Немногие команды используют их, отчасти потому, что обратное движение вперед и хлебные крошки не имеют особого использования. В вашем случае вы могли бы потенциально использовать журнал кадра.
Я все еще, вероятно, не будет, хотя.

Я бы сделал это как приложение с одним окном с пользовательскими элементами управления, представленными в элементе управления контентом для навигации. Пользователь контролирует не страницы. Контентконтроль не фрейм.

Используя MVVM, вы можете сначала перемещаться, используя viewmodel. Создав шаблон модели представления, которую вы привязываете к содержимому элемента управления контентом, в представление.
Сохраните ссылку на модель представления, и вы сохраните состояние.

Вам понадобится какой-нибудь таймер, чтобы в 6 часов вы знали, что пора снова войти в систему.

Это будет указано в модели представления главного окна.
Когда таймер достигает нуля, он сохраняет ссылку на любую текущую модель представления и «переходит» на страницу входа. После завершения процесса в loginviewmodel затем сообщает mainwindowviewmodel, что это сделано.
Я бы, наверное, использовал для этого мессенджер mvvmlight. Он использует шаблон pub / sub.

https://social.technet.microsoft.com/wiki/contents/articles/26070.communicating-between-classes.aspx

Это очень упрощенная иллюстрация навигации первого вида:

    Title="MainWindow" Height="350" Width="525">
<Window.Resources>
    <DataTemplate DataType="{x:Type local:LoginViewModel}">
        <local:LoginUC/>
    </DataTemplate>
    <DataTemplate DataType="{x:Type local:UserViewModel}">
        <local:UserUC/>
    </DataTemplate>
</Window.Resources>
<Window.DataContext>
    <local:MainWindowViewModel/>
</Window.DataContext>
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="100"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <StackPanel>
        <Button Content="Login Page"
                Command="{Binding NavigateCommand}"
                CommandParameter="{x:Type local:LoginViewModel}"
                />
        <Button Content="User Page"
                Command="{Binding NavigateCommand}"
                CommandParameter="{x:Type local:UserViewModel}"
                />
    </StackPanel>
    <ContentControl Grid.Column="1"
                    Content="{Binding CurrentViewModel}"
                    />
</Grid>

ViewModel

public class MainWindowViewModel : INotifyPropertyChanged
{
    private object currentViewModel;

    public object CurrentViewModel
    {
        get { return currentViewModel; }
        set { currentViewModel = value; RaisePropertyChanged(); }
    }
    private RelayCommand<Type> navigateCommand;
    public RelayCommand<Type> NavigateCommand
    {
        get
        {
            return navigateCommand
              ?? (navigateCommand = new RelayCommand<Type>(
                vmType =>
                {
                    CurrentViewModel = null;
                    CurrentViewModel = Activator.CreateInstance(vmType);
                }));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void RaisePropertyChanged([CallerMemberName] String propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

Вы можете кэшировать экземпляры каждой модели представления в словаре, используя тип в качестве ключа, если вы хотите сохранить состояние всего. Проверьте, есть ли он у вас, и верните его, если он есть или создан.
В самом простом случае вы могли бы просто иметь закрытый объект, который содержит последнюю модель представления, когда вам нужно переключиться обратно из входа в систему.
Может быть, вы не хотите слишком буквально понимать эти 6 часов, если пользователь находится в центре чего-то.
Я полагаю, вы также можете сделать что-то вроде предупреждения в 5:30 и позволить им снова войти в систему еще на 6 часов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...