Makale Özeti

Visual Studio Orcas bildiğiniz gibi WPF, WCF gibi kökten değişikliklerle karşımıza çıktı. Bunların yanı sıra windows uygulamaları için de güzel değişiklikler var. Artık Windows uygulamaları ile Asp.Net'te kullandığımız Membership, Role, Profile mekanizmalarını kullanabiliyoruz. Bu makale bu sistemi anlatmaktadır.

Makale

Visual Studio Orcas bildiğiniz gibi WPF, WCF gibi kökten değişikliklerle karşımıza çıktı. Ama mevcut Windows uygulamaları içinde bazı güzel değişiklikler gözümüze çarpıyor. Bunlardan biri ise Windows uygulamaları ise Asp.Net ile kullandığımız Membership, Role, Profile mekanizmalarını kullanabilmemiz. Client Application Services denen bu sistem sayesinde artık web uygulamaları ile entegre çalışan windows uygulamaları yapabiliyoruz. Mevcut sistemde de bunu çeşitli yollardan yapmak mümkün fakat Orcas ile daha entregre olarak karşımıza çıkıyor.

Windows Client Services’den yararlanabilmek için ilk başta Asp.Net Membership ayarları yapılmış bir web sitesine ihtiyacımız var.Bu sitede sayfaların olması gerekmiyor, yapılandırılmış bir web.config dosyasının bulunması yeterlidir. Gerekli ayarları yapılmış bir ve membership’i kullanan bir web sitesi hazırlandıktan sonra artık gerisi Windows uygulamasına kalıyor. (Yaptığımız örnekte Mdemo isimli bir veritabanı yapılandırılmış ve public, admin olmak üzere 2 rol tanımlanmıştır.)

Not : Orcas henüz BETA olduğu için bu örneği yaparken hatalarla karşılabilirsiniz. Bu örnek Sql Server 2008 ve Orcas ile yapılmıştır.

Yapılması gereken ilk ayar Membership mekanizmasından yararlanacağımız web sitesinde. Application Client Services ile bağlantıya izin verilmesi için web.config dosyamıza aşağıdaki izni verdiriyoruz.

<system.web.extensions>

  <scripting>

    <webServices>

           <authenticationService enabled="true" requireSSL="false"  />

            <profileService enabled="true" />

            <roleService enabled="true"/>

     </webServices>

  </scripting>

Eğer bu ayarı yapmazsanız “AuthenticationService Disabled” hatası ile karşılaşacaksınız ve login olamayacaksınız.

Daha sonra windows uygulamasının Windows Client Services’den yararlanabilmesi için Properties ekranından Services tab’ında gerekli ayarların yapılması gerekiyor.

Enable Client application services’ı seçerek uygulamamızdaki gerekli ayarları belirtiyoruz. Membership sınıfından yararlanmak zorunda olduğumuz için System.Web referansını da ekliyoruz.

Authentication service location : Membership kullanılan servis adresi

Credentials provider type : Memberhsip provider’ın, bulunulan windows uygulamasında nerede kullanılacağı (örn : Uygulama.LoginForm, Uygulama) Burada belirttiğiniz form adı, Web uygulamalarındaki loginUrl anlamına geliyor. Bu form içerisinden Credential bilgisi gönderiliyor.

Roles service location : Role mekanizmasında yararlanılacak servis adresi.

Web settings location : Gerekli profile ayarlarının alınacağı servis adresi.

Uygulamamızı aşağıdaki şekilde yapılandırıyoruz.

Gerekli ayarları yaptıktan sonra örnek giriş ekranımızı tasarlıyoruz. Hatta bu ekrana Beni Hatırla seçeneği ekliyoruz :

Eklediğimiz form uygulamamızdaki Login işlemini yapacak olan form, başka bir deyişle Credential bilgisinin iletileceği form olduğu için bu formu IClientFormsAuthenticationCredentialsProvider arayüzünden implement etmemiz gerekiyor. Bu arayüzü implement ettikten sonra GetCredentials metodu içerisinde kullanıcının bilgilerini döndürecek olarak Credential’ı belirtiyoruz.

public ClientFormsAuthenticationCredentials GetCredentials()

        {

            this.ShowDialog();

 

            return new ClientFormsAuthenticationCredentials(

                textBox1.Text, textBox2.Text,

                checkBox1.Checked);

        }

Login button’ununda da sadece uygulamamız için Ok sonucu gönderiyoruz. Login olamama durumunda zaten Client Service bizim için belirttiğiniz login formunu açıyor. ( Bu formu Properties ekranından belirtmiştik).

private void btnLogin_Click(object sender, EventArgs e)

        {

            this.DialogResult = DialogResult.OK;

        }

 

Son olarak geldi uygulamada Login’i açmaya. Bu form içerisinde farkettiyseniz herhangi bir ek işlem yapmadık. Sadece bir ClientFormsAuthenticationCredentials döndüren bir metod var. Bu metod login olunmak istendiğinde çalıştırılıyor. Peki login olunmasını nasıl isteyeceğiz ? Bu işlemi de Web’den bildiğimiz Membership sınıfından yararlanacağız. Uygulama ilk açılırken Login formunu kullanıcının karşısına çıkarmak için boş kullanıcı adı ile giriş yapmak istiyoruz. Bu şekilde giriş yapılamayacağı için uygulama otomatik olarak karşımıza Login formunu çıkartacak. Program.cs dosyamızda aşağıdaki gibi değişiklik yapıyoruz.

  static void Main()

        {

            Application.EnableVisualStyles();

            Application.SetCompatibleTextRenderingDefault(false);

 

           if (!Membership.ValidateUser(string.Empty, string.Empty))

            {

                return;

            }

            Application.Run(new MainForm());

        }

Eğer validateUser içindeki parametreli herhangi bir user bilgileri gönderirseniz o kullanıcı adına oturum açılacaktır.

Not : Eğer System.Web sınıfını referans eklemediyseniz Membership hata verecektir.

Buraya kadar yaptıklarımızı test ettiğiniz taktirde Login formunu açmak için ek birşey yazmamıza rağmen Login formunun açıldığını göreceksiniz.

Not : Açmak istediğinizde Sql CE hatası ile karşılaşıyorsanız yine uygulamanın Property penceresinden, Services sekmesinden advanced button’a tıklayıp Sql CE seçeneğiniz kapatın.

Artık gerekli bilgileri girdiğiniz takdirde uygulamaya giriş yapabilecek, yanlış bilgileri girerseniz otomatik olarak uygulama sizi reddedecektir.

Denemizi yaptıktan sonra Main Formun açıldığını görüyoruz. Peki bu açılan form’dan kullanıcının bilgisini nasıl alırız ?

Bu bilgiyi alabilmek için ClientFormsAuthenticationMembershipProvider sınıfından ve Thread.CurrentPrincipal’dan yararlanacağız.  İlk başta formumuz ilk açıldığında kullanıcı adını görelim. Bunun için Thread.CurrentPrincipal.Identiy kullanacağız.

 

private void MainForm_Load(object sender, EventArgs e)

        {

            lblUser.Text = Thread.CurrentPrincipal.Identity.Name;

        }

 

Kullanıcımız oturum açtığında artık aşağıdaki gibi bir çıktı almaktadır.

Oturum kapatmak gibi Web’de kullandığımı Membership için ise ClientFormsAuthenticationMembershipProvider ‘dan yararlanacağız. 

ClientFormsAuthenticationMembershipProvider provider = (ClientFormsAuthenticationMembershipProvider)Membership.Provider;

 

        private void btnOturumKapat_Click(object sender, EventArgs e)

        {

            provider.Logout();

        }

Provider nesneniz Membership.Provider’a çevrildiği için web’deki metod ve property’leri aynen kullanabilirsiniz.

Son olarak ise yetkilendirmeden bahsetmek istiyorum. Yetkilendirme sonucu bir role’un istediğiniz metodu çalıştırmamasını isteyebilirsiniz. Bunun için ise attribute’lerden yararlancağız. Kullanacağımız attribute System.Security.Permissions.PrincipalPermission attribute’dür. Bu attribute sayesinde hangi metodu hangi rol grubunun çalıştırabileceğini belirtebiliyoruz.

private void btnYetkiDeneme_Click(object sender, EventArgs e)

        {

            try

            {

                Selamlar();

            }

            catch (System.Security.SecurityException ex)

            {

                MessageBox.Show("Yetki Yok");

            }

        }

 

        [System.Security.Permissions.PrincipalPermission(System.Security.Permissions.SecurityAction.Demand, Role = "admin")]

        private void Selamlar()

        {

            MessageBox.Show("Deneme", "Deneme 2", MessageBoxButtons.OK, MessageBoxIcon.Information);

        }

Gördüğünüz gibi gün geçtikçe web ve windows uygulamaları iç içe giriyor ve çok güzel bir şekilde entegre çalışabiliyorlar.

Okan Tekeli

C# MVP, MCT

okan@okantekeli.com