Ana içeriğe atla

WPF - PasswordBox Kontrolü

Windows Presentation Foundation ile uygulama geliştirirken kullanabileceğimiz kontrol paleti işlerimizi rahatlıkla yürütebileceğimiz kadar geniştir. Araç kutusu içerisinde yer alan kontroller Framework sürümünü arttırdıkça ve codeplex, code.msdn gibi sitelerde yer alan projeler yardımı ile daha da artmaya devam etmektedir. WPF 'in grafiksel ve görsel gücüne günlük yaşantı da kullanılan kontrollerin de kullanılabilir olması sayesinde en basit uygulamalardan en karmaşık uygulamalara kadar geliştirilebilme olanağı tanınıyor.

Bu yazımızda WPF üzerinde kullanılan en temel kontrollerin özelliklerini inceliyor ve nasıl kullanıldığını, özellikleri nelerdiri inceliyor olacağız.

WPF - PasswordBox Control
PasswordBox kontrolünün TextBox kontrolüne benzer bir tasarımı vardır. Tek farkı içerisine yazmış olduğumuz karakter,rakam ve özel karakterleri şifreli bir şekilde göstermesidir. Bu özelliği dışında en önemli özeliklerinden biri de kesme,kopyalama ve yapıştırma işlemlerine varsayılan olarak izin vermemesidir.



Windows1.xaml
<StackPanel>
    <Label Content="Şifreniz"/>
    <PasswordBox x:Name="PasswordBox" Width="130"/>
</StackPanel>

PasswordBox kontrolü kullanırken karakterleri tombul noktalarla değilde başka bir karakter ile de göstermek isteyebilirsiniz. Bu durumda yapmanız gereken PasswordChar özelliğine bir değer vermek olacaktır.

<StackPanel>
    <Label Content="Şifreniz"/>
    <PasswordBox x:Name="PasswordBox" PasswordChar="*" Width="130"/>
</StackPanel>

Karakteri değiştirdikten sonra aklınıza gelebilecek bir diğer değişiklik düşüncesi ile karakter girişini sınırlamak olabilir. Bu durumda ise MaxLength özelliğine bir değer atamanız yeterli olacaktır.

<StackPanel>
    <Label Content="Şifreniz"/>
    <PasswordBox x:Name="PasswordBox" PasswordChar="*" MaxLength="6" Width="130"/>
</StackPanel>

PasswordBox kontrolüne girilebilecek max karakter sayısınıda belirledik.

WPF Password Kontrolünde Databinding İşlemi
Passworbox kontrolü ile veri işlemlerini veriye bağlama yolu ile direk yapamayız. Bunun sebebi ise DependencyProperty tarafında desteklenen bir şifre türü değildir.

Nedenini açıklamak gerekirse, DataBinding ile tuttuğumuz parolalalar güvenlik sebebiyle iyi bir tercih değildir. Ancak bazı durumlarda bu kontrolünü kullanmak gerekebilmektedir. Özel durumlarda aşağıda oluşturacağımız PasswordBoxHelper 'dan yararlanabilirsiniz.

Windows1.xaml
<StackPanel>
    <PasswordBox w:PasswordHelper.Attach="True"
        w:PasswordHelper.Password="{Binding Text, ElementName=plain, Mode=TwoWay}"
        Width="130"/>
    <TextBlock Padding="10,0" x:Name="plain" />
</StackPanel>

XAML kod tarafında PasswordHelper sınıfını xmlnamespaces (xmlns:w) ekliyoruz. Sonrasında ise PasswordHelper.Attach ve PasswordHelper.Password özelliklerini orjinal password özelliğine bağlayarak güvenlik açıklarını ortadan kaldırmış oluyoruz.

PasswordHelper.cs
public static class PasswordHelper
{
    public static readonly DependencyProperty PasswordProperty =
    DependencyProperty.RegisterAttached("Password",
        typeof(string), typeof(PasswordHelper),
    new FrameworkPropertyMetadata(string.Empty, OnPasswordPropertyChanged));

    public static readonly DependencyProperty AttachProperty =
    DependencyProperty.RegisterAttached("Attach",
    typeof(bool), typeof(PasswordHelper), new PropertyMetadata(false, Attach));

    private static readonly DependencyProperty IsUpdatingProperty =
    DependencyProperty.RegisterAttached("IsUpdating", typeof(bool),
        typeof(PasswordHelper));


    public static void SetAttach(DependencyObject dp, bool value)
    {
        dp.SetValue(AttachProperty, value);
    }

    public static bool GetAttach(DependencyObject dp)
    {
        return (bool)dp.GetValue(AttachProperty);
    }

    public static string GetPassword(DependencyObject dp)
    {
        return (string)dp.GetValue(PasswordProperty);
    }

    public static void SetPassword(DependencyObject dp, string value)
    {
        dp.SetValue(PasswordProperty, value);
    }

    private static bool GetIsUpdating(DependencyObject dp)
    {
        return (bool)dp.GetValue(IsUpdatingProperty);
    }

    private static void SetIsUpdating(DependencyObject dp, bool value)
    {
        dp.SetValue(IsUpdatingProperty, value);
    }

    private static void OnPasswordPropertyChanged(DependencyObject sender,
        DependencyPropertyChangedEventArgs e)
    {
        PasswordBox passwordBox = sender as PasswordBox;
        passwordBox.PasswordChanged -= PasswordChanged;
       
        if (!(bool)GetIsUpdating(passwordBox))
        {
            passwordBox.Password = (string)e.NewValue;
        }
        passwordBox.PasswordChanged += PasswordChanged;
    }

    private static void Attach(DependencyObject sender,
        DependencyPropertyChangedEventArgs e)
    {
        PasswordBox passwordBox = sender as PasswordBox;

        if (passwordBox == null)
            return;

        if ((bool)e.OldValue)
        {
            passwordBox.PasswordChanged -= PasswordChanged;
        }
   
        if ((bool)e.NewValue)
        {
            passwordBox.PasswordChanged += PasswordChanged;
        }
    }

    private static void PasswordChanged(object sender, RoutedEventArgs e)
    {
        PasswordBox passwordBox = sender as PasswordBox;
        SetIsUpdating(passwordBox, true);
        SetPassword(passwordBox, passwordBox.Password);
        SetIsUpdating(passwordBox, false);
    }
}

PasswordHelper sınıfı yardımı ile PasswordBox kontrolünün yetkinliklerini ve güvenlik özelliklerini fazlası ile arttırabilmemiz mümkündür. Bu arada bu sınıfı hazırlayan functional blog grubuna da teşekkürlerimizi sunuyoruz.

Sonuç olarak PasswordBox kontrolünü kullanmak istediğimizde neler yapabileceğimize detaylı bir şekilde değinmeye çalıştık. Ayrıca DataBinding işlemleri esnasında bu kontrolün yeterince güvenli olmadığını ve kendi PasswordHelper sınıfını oluşturarak daha güvenlikli bir hale nasıl getirebileceğimize değinmeye çalıştık.

Umarım yararlı olabilmiştir.

Yorumlar

Bu blogdaki popüler yayınlar

SharePoint 2010 - Content Query for Blog Posts

I hope this post will help many of you feel comfortable with using the Content Query Web Part. In this post I will walk you through the process of creating a content query web part and configuring it to show custom field types. I will also give details on how to use XSLT to stylize and format the data being pulled. I will be using the following scenario as an example. Say that you had a site collection with a top level publishing site. This publishing site would display a the most recent blog posts from all blog sites within its own site collection. To solve this problem we will use a Content Query Web Part and a customized ItemStyle.xsl using XSLT. Please note that the “SharePoint Server Publishing Infrastructure” needs to be enabled at the site collection to display the content query web part. Step 1: Add a Content Query Web Part to Page Navigate to the site that you want the blog posts to show up and click on edit page. Under Editing Tools in the Ribb

Olasılıksız - Kitap Yorum

Olasılıksız hayatımda okuduğum en iyi kitaptı. Tek çırpıda hiç sıkılmadan, eğlenerek okudum bu kitabı, tavsiyem sizinde okumanız. Kitabın kapağı ve içeriği ile ilgili kısa bilgi aşağıdadır. Olasılık, tahmin, düşünceler, nöbetler, karışıklıklar, ileriyi görebilme zannı, dejavu ve tabii ki olasılıksız şeyler. Bu kelimelerle içli dışlı olabileceğiniz, bütün bu kelimelerin yaşamdaki yerini kavrayabileceğiniz müthiş bir uyarlama. Adam Fawer' ın ortaya çıkardığı bu uyarlama romanın müthiş bir çalışmanın ve araştırmanın sonucu ortaya çıktığının kitabın başından sonuna kadar farkındasınız. Bu uyarlamasını, derin araştırmalarıyla birleştirip romanı tekdüzelikten çıkarıp müthiş bir yere koyduğu için de Fawer' a müteşekkir oluveriyorsunuz. Sıkıcı diye nitelendirebileceğiniz teorik bilgileri bile bir çırpıda okuyuveriyorsunuz. Teorik bilgiler dahi olaylarla sonuna kadar bağlantılı aktarılmış. Tekdüzelikten çıkmış bir roman; olasılıksız. Her an olayın kurgusunun değişmesi olasılık dahilind

.Net 3.5 SP1 – Full Install Packages (Tam Kurulum)

.Net Framework 3.5 SP1 ‘i bilgisayarınıza kurmak istediğinizde normal şartlar altında Microsoft ‘un sitesinde 2.7 mb ‘lik bir dosya indirir ve kurulum işlemlerinizi bu dosya üzerinden yaparsınız. Ancak bu indirmiş oluğunuz dosya yaklaşık 220 mb ‘lik veriyi internetten indirerek kurulum yapmaktadır. İnternet çıkışına izin verilmeyen kurumlar ve kuruluşlar için bu durum bir sıkıntı oluşturmaktadır. Bu sebepten ötürü aşağıdaki link yardımı ile tam yükleme paketini indirdikten sonra hiç internet ihtiyacınız olmadan .Net 3.5 SP1 ‘i kurabilmeniz mümkün olacaktır. Link