×
Namespaces

Variants
Actions

Janela para entrada de dados confidenciais no Windows Phone

From Nokia Developer 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 14:26.
103 page views in the last 30 days.