Skip to main content

WCF Servisinin HTTPS Yayını ve Metotlarına Kullanıcı adı Parola ile Erişim

Giriş

Bu yazıda bir wcf servisinin https olarak bir iis üzerinde yayınlanmasını ve de servis metotlarının bir kullanıcı adı ve şifre korunması için neler yapılması gerektiğini bulabilirsiniz.
Not: Bu yazıda Wcf servisi bir web application üzerinde yer almaktadır.
Gerekli Tool’lar
SelfCert.exe: 
Servisin yayınlanacağı iis için gerekli ola sertifika oluşturmak  için kullanacağız.
winhttpcertcfg.msi: 
Command line’dan komut çalıştıracağımız bir exe’dir. Oluşturduğumuz sertifikanın iis’de yer alan application pool tarafından okunabilmesine izin verilmesi için kullanılır.

WCF Servis Ayarları

Wcf servisi güvenliğini ve verilerinin gizlilğini iki aşamalı bir koruma ile  sağlayacağız:
Clientların servis içerisinde yer alan metotlara erişebilmeleri için izin verilen kullanıcı adı ve paraloları bilmesi gerekmektedir. Bu amaçla servis uygulamasına bir adet .cs file ekleyip içerisini Custom Validation da ki gibi dolduralım. Bu işlemden sonra için web.config içerisinde bazı ayarlar yapılması gerekmektedir. Bu ayarları örnek web.config içerisinde bulabilirsiniz.


 Servisin Https Üzerinden Host Edilmesi

Bu işlem için iis’in bulunduğu makina üzerinde bir takım ayarlar yapılması gereklidir. 
  1. Bir WCF servisinin iis üzerinde host edilebilmesi için iis üzerinde “Mime Types” ve “Handler Mapping” in ayarlarının .svc dosyaları için yapılmış olması gereklidir. Bu daha önce yapılmış olabilir. Kontrol etmek için default web site’a tıklayın ve sağda yer alan Mime Types’a tıklayın.Açılan pencerede yer alan extention’lar arasında .svc olması gereklidir.  







 Eğer bu listede yoksa bizim kenmizin eklemesi gerekecektir.



Handler Mapping ayarlarının kontrolü ve yapılması da aynı şekidedir. Burada eğer gerekli ayarlar yoksa yeni bir handler mapping eklenmelidir.





Bu işlemlerden sonra iis’in yapılan değişiklikleri algılaması için command line’da aşağıdaki command’in çalıştırılması gereklidir.




2-Bu aşamada sunucumuz için bir sertifika oluşturacağız. Bu işlem için SelfCer.exe’yi kullanacağız. Burada certifika adının makinaip’si olması tercih edilmelidir. Makina adını yazdıktan sonra save butonu yardımıyla sertifikamızı oluşturalım.

3- Şimdi ise uygulamamızın kullandığı application pool’unun bu sertifikaya erişebilmesi için sunucumuza  winhttpcertcfg.msi kuralım. Kurma işleminden sonra command line administrator olarak açalım ve aşağıdaki komutu çalıştıralım. Bu kommut’ta 2 adet değişken vardır; certifika adı(yukarda ip adı ile oluşturduk), ikincisi ise kullanılacak Application pool. 


C:\Program Files (x86)\Windows Resource Kits\Tools>winhttpcertcfg -g -c  LOCAL_MACHINE\My -s 192.168.5.49 -a DefaultAppPool
4-Artık iis’imizin binding setting’lerine https ekleyebiliriz. Default web site seçili iken sağda yer alan “Bindings...” ayarlarından yeni bir binding ekleyerek (https) sertifakamızla ilişkilendirebiliriz.
5-Son olarak uygulamamızın sadece https üzeriden yayın yapmasını istiyorsak, default web site altnda yer alan uygulamamız seçili iken orta alanda açılan pencerede yer alan SSL Settings tıklanarak SSL Required ayarı seçilmelidir.
Client Uygulaması Ayarları

Client olarak bir console application uygulaması oluşturalım. Oluşturduktan sonra web servisimizin referansını uygulamaıza ekleyelim.

Yukarda yer alan pecereye benzer bir pencere açılacaktır. Yes’e basarak servis referansımızı ekleyelim. Bu işlem sonrasında console application’ımız da yer alan app.config dosyasına bir bir takım ayarlar yazacaktır. Bu ayarları kaldırabiliriz. Bu ayarları kodda “örnek client kodu” başlığı  altındaki gibi yapacağız.

Örnek Client Kod

class Program
    {
        static void Main(string[] args)
        {
            try
            {
                ServicePointManager.ServerCertificateValidationCallback =IgnoreCertificateErrorHandler;

                var serviceendPoint = new EndpointAddress(new Uri("https://192.168.5.49/wcf/service.svc"),
                         EndpointIdentity.CreateDnsIdentity("192.168.5.49"));
                var binding = new WSHttpBinding
                {
                    Security =
                    {
                        Mode = SecurityMode.TransportWithMessageCredential,
                        Transport = { ClientCredentialType = HttpClientCredentialType.None },
                        Message =
                        {
                            ClientCredentialType = MessageCredentialType.UserName
                        }
                    }
                };

                var result = new ServiceClient(binding, serviceendPoint);
                if (result.ClientCredentials != null)
                {
                    result.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode =
                        X509CertificateValidationMode.None;
                    result.ClientCredentials.UserName.UserName = "kullanıciadi";
                    result.ClientCredentials.UserName.Password = "parola";
                }
                string text = result.DoWork("");
                Console.WriteLine(text);
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }

            Console.ReadLine();
        }

        public static bool IgnoreCertificateErrorHandler
    (object sender, X509Certificate certificate, X509Chain chain,
    SslPolicyErrors sslPolicyErrors)
        {
            return true;
        }
    }

Custom Validation

using System.IdentityModel.Selectors;
using System.ServiceModel;
class MyValidator : UserNamePasswordValidator
{

    public override void Validate(string userName, string password)
    {

        if ((userName == "kullanıcıadı") && (password == "parola"))
        {
            
        }
        else
        {
            throw new FaultException("Invalid credentials");
        }
    }}

Örnek Web.config

xml
version="1.0"?>


<configuration>
    <system.web>
      <compilation debug="true" targetFramework="4.5" />
      <httpRuntime targetFramework="4.5" />
    </system.web>

  <system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
      multipleSiteBindingsEnabled="true" />
    <bindings>
      <wsHttpBinding>
        <binding name="Binding1">
         
          <security mode="TransportWithMessageCredential" >
            <message clientCredentialType="UserName"/>
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <services>
      <service name="WebApp.Service" behaviorConfiguration="ServiceBehavior">
        <endpoint address="" binding="wsHttpBinding" contract="WebApp.IService" bindingConfiguration="Binding1">
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange"/>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ServiceBehavior">
          <serviceMetadata httpsGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
          <serviceCredentials>
            <serviceCertificate findValue="192.168.5.49"
                         storeLocation="LocalMachine"
                         storeName="My"
                         x509FindType="FindBySubjectName" />
            <userNameAuthentication userNamePasswordValidationMode="Custom"
              customUserNamePasswordValidatorType="MyValidator, app_code" />
          </serviceCredentials>
        </behavior>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>


</configuration>







Comments

Popular posts from this blog

En basit şekliyle Sql Join

ASP.NET uygulamalarında WebResource kullanımı (WebResource.axd)

          Web uygulamalarında genellikle resourcelar uygulama içerisine eklenerek sayfalarda path'lari ile çağırılırlar. Bu kullanım açısıdan çok kullanışlı bir yöntem değildir. Şöyleki bazı resourcelarımız her uygulamada olması gereken resourcelardır. Bu resourceları her uygulamaya eklemek etkili bir kullanım değildir. Bunun yerine webresource yöntemiyle istediğimiz resoruceları bir class libary(dll) içerisine koyup, uygulamalarımıza bu dll'i eklememiz daha kullanışlı bir yöntem olacaktır. Bu yazıda da bir image libary dll oluşturmayı ve uygulama içerisinden bu dll içerisinde yer alan resimler çağırmayı adım adım anlatmaya çalışacağım. 1)Solution'ımız 2 adet proje oluşturalım.   - WebApplication(WebApp)   -Class Libary(ResourceLibary) 2)Image libary olarak kullanacağımız dll içerisine image'larımızı ekleyelim. 3)Her bir image'ın üzerine sağ click ile açılan window üzerinden Build Action özelliğini Embedded Resource olarak değiştirelim. ...