Служба навигации и аутентификации Silverlight - PullRequest
2 голосов
/ 29 мая 2009

Я создаю приложение Silver Light, используя шаблон приложения Navigation. Это для внутреннего использования и, следовательно, использует Windows authenticatoin. Существует страница панели инструментов, которая показывает пару записей, отфильтрованных по идентификатору пользователя, вошедшего в систему. Чтобы получить идентификатор пользователя (который является int), я вызываю веб-сервис, переопределяя GetAuthenticatedUser, и передаю имя пользователя (из IPrincipal). Эта услуга занимает некоторое время, чтобы вернуть детали.

Когда я перехожу к приложению панели мониторинга, оно полностью рендерится без данных, потому что пользовательский сервис является асинхронной операцией, и я не могу заставить рендеринг подождать до полного завершения работы моего GetAuthenticatedUser. Поэтому я создал страницу входа в систему, на которой отображается индикатор выполнения, пока я не получу объект пользователя, а затем не перейду к панели мониторинга. Если кто-то пытается получить доступ к панели мониторинга напрямую с помощью URL-адреса, я хочу, чтобы он вернулся обратно на страницу входа.

Итак, в конструкторе панели инструментов я добавил следующий код

        if (!UserService.Current.User.IsAuthenticated)
        {
            MessageBox.Show("Navigating away");
            Frame objContainer = this.Parent as Frame;
            objContainer.Navigate(new Uri("/Views/Login.xaml", UriKind.Relative));
        }

Хотя я получаю подсказку с окном сообщения, она на самом деле не переводит меня на страницу входа, а остается на странице панели инструментов. Я также попытался положить этот код в OnNavigatedTo переопределить без удачи.

Я также попытался использовать NavigationService вместо Frame, как показано ниже, но безуспешно

        if (!UserService.Current.User.IsAuthenticated)
        {
            MessageBox.Show("Navigating away");
            this.NavigationService.Navigate(new Uri("/Views/Login.xaml", UriKind.Relative));
        }

это все еще не работает. Кто-нибудь знает, как сделать какую-то страницу доступной, только если у меня есть полностью действительный пользовательский объект? если они попытаются получить доступ к закрытой странице без этого, я хочу, чтобы они могли перенаправляться на страницу входа в систему, как этого можно достичь?

Я использую Silverlight 3 Beta

Shreedhar

1 Ответ

1 голос
/ 31 мая 2009

Я наконец нашел способ обойти это. В Constructo i Hooked подключен обработчик событий Loaded, а в обработчике событий я перехожу на другую страницу, и теперь она работает нормально.

    public Dashboard()
    {
        InitializeComponent();
        this.Loaded += new RoutedEventHandler(Dashboard_Loaded);
    }

    void Dashboard_Loaded(object sender, RoutedEventArgs e)
    {
        if (!UserService.Current.User.IsAuthenticated)
        {
            Frame objContainer = this.Parent as Frame;
            if (objContainer != null)
            {
                objContainer.Navigate(new Uri("/Views/Login.xaml", UriKind.Relative));
            }
        }
    }

Этот кусок кода работает просто отлично!

Shreedhar

...