Namespaces

Variants
Actions

Please note that as of October 24, 2014, the Nokia Developer Wiki will no longer be accepting user contributions, including new entries, edits and comments, as we begin transitioning to our new home, in the Windows Phone Development Wiki. We plan to move over the majority of the existing entries over the next few weeks. Thanks for all your past and future contributions.

Janela para entrada de dados confidenciais no Windows Phone

From Wiki
Jump to: navigation, search

Algumas aplicações precisam de acesso a dados confidenciais. Este artigo mostra como criar um janela de para fornecer dados confidenciais (como senhas) para a aplicação.

WP Metro Icon UI.png
SignpostIcon XAML 40.png
WP Metro Icon WP8.png
SignpostIcon WP7 70px.png
Article Metadata

Compatibilidade
Artigo
Tradução:
Por saramgsilva
Última alteração feita por hamishwillee em 15 Jul 2013

Introdução

Implementando uma página de acesso para aplicações de Windows Phone pode causar vários problemas: é difícil de controlar a navigation stack e cumprir os requisitos de armazenamento relativas à navegação. Isto é em parte porque não existe um método para sair de um aplicativo no caso de uma senha errada. É necessário remover a página de login da pilha página (usando NavigationService.RemoveBackEntry, um método adicionado na versão Mango) de modo que o aplicativo pode ser encerrado sem ultrapassar a página de login novamente ao pressionar o botão de volta.

Solução

Uma maneira mais fácil é usar um pop-up criados dinamicamente no topo da página principal.

Loginscreen.png

Tal como ilustrado abaixo, o pop-up é criado no "event's handler" Loaded da página:

private void MainPage_Loaded(object sender, RoutedEventArgs e)
{
if (!app.IsAuthenticated)
{
p = new Popup();
LayoutRoot.Children.Add(p);
ApplicationBar.IsVisible = false;
 
// Set where the popup will show up on the screen.
p.VerticalOffset = 60;
p.HorizontalOffset = 25;
 
Border border = new Border();
border.BorderBrush = new SolidColorBrush(Colors.White);
border.BorderThickness = new Thickness(5.0);
 
StackPanel panel1 = new StackPanel();
panel1.Background = new SolidColorBrush(Colors.Black);
panel1.Width = LayoutRoot.ActualWidth - 2 * p.HorizontalOffset;
 
Button button1 = new Button();
button1.Content = "OK";
button1.Margin = new Thickness(5.0);
button1.Click += new RoutedEventHandler(loginbutton_Click);
TextBlock textblock1 = new TextBlock();
textblock1.TextWrapping = TextWrapping.Wrap;
if (app.FirstRun)
textblock1.Text = "Please enter your choice of a password:";
else
textblock1.Text = "Please enter your password";
textblock1.Margin = new Thickness(5.0);
textblock1.FontSize = 30;
textblock1.Foreground = new SolidColorBrush(Colors.White);
pb = new PasswordBox();
pb.KeyDown += new KeyEventHandler(pb_KeyDown);
panel1.Children.Add(textblock1);
panel1.Children.Add(pb);
if (app.FirstRun)
{
TextBlock textblock2 = new TextBlock();
textblock2.TextWrapping = textblock1.TextWrapping;
textblock2.Margin = textblock1.Margin;
textblock2.FontSize = textblock1.FontSize;
textblock2.Foreground = textblock1.Foreground;
textblock2.Text = "Please repeat the password";
pb2 = new PasswordBox();
panel1.Children.Add(textblock2);
panel1.Children.Add(pb2);
}
panel1.Children.Add(button1);
border.Child = panel1;
 
// Set the Child property of Popup to the border
// which contains a stackpanel, textblock and button.
p.Child = border;
 
// Open the popup.
p.IsOpen = true;
pb.Focus();
}
else
// Set the data context of the listbox control to the sample data
DataContext = App.ViewModel;
}

A verificação da password acontece no login, isto é, quando o loginbutton_Click ocorre (o botão Ok é precisionado). Se a palavra-passe não estiver correcta o utilizador pode voltar a inserir a palavra-passe.

private void loginbutton_Click(object sender, RoutedEventArgs e)
{
// Close the popup.
p.IsOpen = false;
if (app.FirstRun)
{
if (!pb.Password.Equals(pb2.Password))
{
MessageBox.Show("The passwords do not match. Please try again.");
p.IsOpen = true;
pb.Password = "";
pb2.Password = "";
pb.Focus();
return;
}
app.PwdHash = CryptoUtil.GetHashCode(pb.Password);
app.IsAuthenticated = true;
app.FirstRun = false;
App.ViewModel.LoadData();
}
else
app.IsAuthenticated = CryptoUtil.GetHashCode(pb.Password).CompareTo(app.PwdHash) == 0;
 
if (app.IsAuthenticated)
{
DataContext = App.ViewModel;
ApplicationBar.IsVisible = true;
}
else
{
tb = new TextBlock();
tb.Text = "Wrong password.";
tb.FontSize = 36;
tb.Foreground = new SolidColorBrush(Colors.Red);
tb.Margin = new Thickness(12);
tb.SetValue(Grid.RowProperty, 2);
LayoutRoot.Children.Add(tb);
ApplicationBar.IsVisible = true;
(ApplicationBar.MenuItems[0] as ApplicationBarMenuItem).IsEnabled = false;
 
DataContext = null;
}
}

Pressionando a tecla "Enter", o método loginbutton_Click será invocado e o login será efetuado.

void pb_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter) // Enter equal OK button
loginbutton_Click(this, new RoutedEventArgs());
}

Quando a tecla "Back" é pressionada e o popup está aberta, a palavra passe será verificada.

private void PhoneApplicationPage_BackKeyPress(object sender, System.ComponentModel.CancelEventArgs e)
{
if (p.IsOpen)
{ // if the popup is still there... emulate OK button click
loginbutton_Click(this, new RoutedEventArgs());
e.Cancel = true;
}
}

Durante a primeira vez que a aplicação corre, a palavra passe é requerida ao utilizador. A palavra-passe em si não é armazenado no aplicativo, mas sim do código hash é armazenado. Em sucessivas ocasiões, o hash para a senha digitada é calculado e comparado com o valor hash armazenado. Consultar How to encrypt your application data in Windows Phone (*)


Código exemplo

O código para a janela de acesso foi adicionado ao exemplo Media:EncryptionSample.zip do artigo How to encrypt your application data in Windows Phone (*).

(*) Artigo disponível apenas em inglês.

This page was last modified on 15 July 2013, at 11:26.
182 page views in the last 30 days.

Was this page helpful?

Your feedback about this content is important. Let us know what you think.

 

Thank you!

We appreciate your feedback.

×