WCF’te Güvenliği Username Authentication ve SSL ile Sağlamak

Merhaba Arkadaşlar,

Uzun zaman oldu yazmayalı biliyorum. Fakat yazmamamın önemli bir sebebi var. WCF’te güvenliği nasıl sağlarım gibi sorunları çözmeye odaklanmışken saatlerin hatta günlerin nasıl geçtiğini anlayamadım 🙂 Neyse konumuza geçelim isterseniz.

WCF’te güvenlik en önemli konulardan bir tanesidir. Client’tan yapılan isteklerin yönlendiği svc uzantılı servis dosyamızın adresi fiddler gibi araçlarla rahatlıkla görülebilir ve hatta başka projelerde bile belki haberimiz olmadan bile kullanılabilir. Bunun önüne geçebilmek için username authentication en önemli sebeplerden bir tanesidir. Username authentication demişken bunu nasıl şifreleyeceğiz ? 🙂 Tabiki SSL sertifikasını kullanarak.

Önemli Not: SSL Sertifikasını Certification Authority’den almışsak kullanmamızda hiçbir sıkıntı oluşmayacaktır ve hatalarla uğraşmak zorunda kalmayacağız. SSL sertifikasını biz oluşturmuşsak yani Self-Signed Certificate kullanıyorsak malesef bazı sorunlarla karşılaşmamız muhtemel. Özellikle SSL doğrulamada sıkıntı yaşamaktayız hatta Windows Phone’da malesef ki framework’ta SSL doğrulamayı devre dışı bırakacak bir mekanizmamız bulunmamaktadır.Peki ne olacak? İlla Windows Phone’da kullanacaksanız Self-Signed Sertifika kullanmayacaksınız yani parayla sertifika almaktan başka çareniz malesef ki bulunmuyor. Bu yüzden yazacağımız alıştırmada istemci(client) tarafını Console Application olarak seçeceğim ki Sertifika Onaylamasını devre dışı bırakabilelim.

Öncelikle bir WCF projesi oluşturalım ve Username Authentication kısmını yapacak olan class’ımızı düzenleyelim.

Yukarıdaki sınıfımıza göre kullanıcı adı “sehmus” ve sifre “123456” değilse validation fonksiyonumuz bir exception fırlatacak ve WCF isteğimiz istemcimize geri dönmeyecektir.

Not: System.IdentityModel assembly’îni referanslarımıza eklemek zorundayız.

Sıra geldi web.config dosyamıza yapacağımız değişikliklere:

Öncelikle sınıfımızın davranış (behavior) larını tanımlayalım. Yazacağımız her alt node <system.serviceModel> node’unun alt node’udur.

Sıra geldi servisimiz için binding oluşturmaya. Bunun için <system.servicemodel> alt node’u olan bir node daha yaratıyoruz.

Böylelikle mesaj seviyesinde güvenlik ve username authentication’u olan bir WCF servisine doğru yol alıyoruz. Devam Edelim sonraki hedefimiz servis tanımımızı ve endpointlerimizi belirlemek.

Bunun ardından konfigürasyon konusunda yapmamız gerekenler bitti 🙂 Self Signed Sertifikamızı nasıl oluşturacağız peki ? Hemen o konuya da değinelim. Ben Windows Azure ile uyumlu olsun diye Azure’un sitesinden aldığım sertifika oluşturma command line kodunu sizlere aktarayım 🙂

Hemen Visual Studio Command Prompt’u açalım ve:

komutunu çalıştıralım. Artık Self-Signed sertifikamız kullanıma hazırdır. Private Key ve CER dosyalarını nasıl import ederim diyorsanız bunu windows’un kendi komponent’i olan MMC ile rahatlıkla yapabilirsiniz. Bu aralara da başlangıç ve bitiş tarihlerine de dikkat edelim.

Hemen ardından bir Console Application Projesi oluşturalım ve duruma bir göz atalım 🙂

Program.cs dosyamızı oluşturalım ve gerekli assembly dll dosyalarını projemize ekleyelim. Add Service Reference deyip oluşturduğumuz wcf servis adresini yazalım ve işlemi sonlandıralım.

Herşey bu kadar. Güvenli ve huzurlu kodlama ortamı dilerim 🙂

 

Bu yazı Yazılarım kategorisine gönderilmiş ve , , , , , ile etiketlenmiş. Kalıcı bağlantıyı yer imlerinize ekleyin.

WCF’te Güvenliği Username Authentication ve SSL ile Sağlamak için 8 cevap

  1. Ibrahim S. der ki:

    Gerçekten çok güzel bir yazı olmuş, Web.config xml tanımlarınız İngilizce kaynaklardakinden daha iyi ve doğru. Elinize sağlık.

    Bir ekleme de ben yapayım, sertifikayı yaratmak için SelfCert isimli freeware bir tool var, o da kullanılabilir.

    Selamlar saygılar.

  2. sehmusgokce der ki:

    Yorumunuz için Teşekkür ederim. Beğenmenize sevindim. Takıldığınız konular var ise biliyorsam elimden geldiğince yardım etmeye çalışırım. Kolay gelsin 🙂

  3. Serhat der ki:

    Öncelikle makale için teşekkürler. Örneği deniyorum ama sanırım sertifika kısmında sorun yaşıyorum veya başka yerde sorun yaşıyorum. Örnek proje yollayabilirmisiniz veya bu konu hakkında bir video yayınlayabilirmisiniz ?

  4. sehmusgokce der ki:

    Merhabalar,

    Takıldığınız yeri ve aldığınız hatayı buradan iletirseniz. Elimden gelen yardımı yaparım.
    Kolay Gelsin…

  5. Abdullah ÇELİK der ki:

    command promt uzerindeki işlemi gerceklestiremiyorum, Error: Can’t create the key of the subject bu hatayı veriyor yardımcı olabilirmisiniz.

    • sehmusgokce der ki:

      Merhabalar,

      Kullandığım komut satırını aynen yazdım. Fakat sorun yaşıyorsanız Google üzerinde How to create self signed certificate diye aratırsanız değişik komutlara da ulaşabileceğinizi düşünüyorum.
      Kolay Gelsin.

  6. Murat YEŞİLBAŞ der ki:

    Merhabalar,

    UserNamePassValidator classında kullanıcı bulunamadı zaman bir FaultException firlatmışsınız. Bu hatayı http bağlantı üzerinde sıkıntısız okuyabilmekteyim. Ancak https bağlantıda yani transport seviyesinde güvenliği açtığım zaman faultexp hatasını client tarafında okuyamıyorum. Client tarafında message security exception was unhandled hatası almaktayım. Nedeni ise “Sanırım” kullanıcı doğrulama işlemi başarılı olmadığı için. Umarım anlatabilmişimdir. Bunu nasıl aşabiliriz?

    Özetle https bir bağlantıda Unauthenticated mesajını istemciye nasıl yollayabilirim.

     

    Teşekkürler.

    • sehmusgokce der ki:

      Merhabalar,

      SSL’in de mantigi aslinda budur. Bilgiler sunucu ile istemci arasinda encrypt edilir. Yani SSL baglantisi kurulmadan once sunucu ssl sertifikasini istemciye gönderir ve istemci encryption key ve sunucudan gelen public key’i şifreleyip sunucuya gönderir. Hemen ardindan güvenli veri iletişimi saglanir. Yani siz Fiddler gibi uygulamalarla baglantiyi sniff etmeye calisirsaniz response veya request body’i göremezsiniz.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir